가변 높이 UITableView 내에서 콘텐츠를 기반으로 UIWebView 높이를 결정하는 방법은 무엇입니까?
이 질문UITableView 에 대한 답변에서 설명한대로 가변 높이 행 을 만들려고합니다.
내 문제는 각 셀 UIWebView에 다른 (정적으로로드 된) 콘텐츠 가 포함되어 있으므로 콘텐츠를 기반으로 적절한 높이를 계산하는 방법을 알 수 없습니다. 이를 수행하는 방법이 있습니까? 나는 다음과 같은 것을 시도했다.
(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
WebViewCell *cell = (WebViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];
[cell setNeedsLayout];
[cell layoutIfNeeded];
return cell.bounds.size.height;
}
세포 자체는 단순히있는 펜촉에서로드 UITableViewCell가 포함 된 UIWebView. (가변 높이가 더 좋을지라도 셀이 가장 큰 html 콘텐츠로 방금 조정 된 경우에도 괜찮습니다).
이 코드는 아마도 테이블 뷰 사용에 너무 느릴 수 있지만 트릭을 수행합니다. UIWebView는 DOM에 대한 직접적인 액세스를 제공하지 않기 때문에 대안이없는 것처럼 보입니다.
뷰 컨트롤러에서 viewDidLoad웹뷰에 HTML을로드하고로드가 완료되면 자바 스크립트를 실행하여 요소 높이를 반환합니다.
- (void)viewDidLoad
{
[super viewDidLoad];
webview.delegate = self;
[webview loadHTMLString:@"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"];
NSLog(@"height: %@", output);
}
나는 당신의 대답을 찾아서 매우 기뻤습니다. 자바 스크립트 트릭은 저에게 잘 맞았습니다.
그러나 "sizeThatFits :"메서드도 있다고 말하고 싶었습니다.
CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)];
선호하는 크기를 0이 아닌 다른 크기로 설정해야하지만 그 외에는 일반적으로 항상 작동합니다!
일반적으로 UIWebViews를 사용하면 두 번째로드에서만 작동하는 것처럼 보입니다 ( "loadHTMLString :"메서드를 사용하고 "didFinishLoad :"대리자에서 "sizeThatFits :"를 호출합니다).
그래서 어떤 경우에도 작동하는 솔루션을 찾아서 매우 기뻤습니다.
이것은 작동하는 것 같습니다. 지금은.
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
CGFloat webViewHeight = 0.0f;
if (self.subviews.count > 0) {
UIView *scrollerView = [self.subviews objectAtIndex:0];
if (scrollerView.subviews.count > 0) {
UIView *webDocView = scrollerView.subviews.lastObject;
if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]])
webViewHeight = webDocView.frame.size.height;
}
}
}
실패하면 안전하게 0을 반환해야합니다.
문제 -sizeThatFits:는 최소한 iOS 4.1에서는 작동하지 않는다는 것입니다. webView의 현재 크기 만 반환합니다 (CGSizeZero 또는 임의의 0이 아닌 크기로 호출되었는지 여부에 관계없이).
호출하기 전에 webView의 프레임 높이를 줄이면 실제로 작동한다는 것을 알았습니다 -sizeThatFits:.
내 솔루션보기 : UIWebView의 콘텐츠 크기를 결정하는 방법?
처음에는 sizeThatFits에 잘못된 값이 있지만 그 이후에는 그렇지 않은 경우 여기에 발생한 가능한 원인은 외부 CSS의 버그입니다. 외부 CSS가 검색되고 웹 문서가 완전히 빌드되기 전에 webViewDidFinisLoad가 곧 호출되는 것 같습니다. 캐시로 인해 다시로드하면 버그가 사라진 것 같아요.
트릭 : 애플리케이션에서 곧 더미 UIWebView로 CSS를 미리로드하세요.
SDK : IOS4
webview 측정은 작동하지만 콘텐츠를로드 한 경우에만 작동합니다.
- 웹뷰를 작게 만들기 (예 : 5px)
- 그것을로드하고 완료를 기다립니다
- 그것에 sizeToFit 호출
- 크기를 얻는 다음
- tableview를 다시로드합니다 (셀의 올바른 높이를 반환).
광고 : : D이 문제로 고생하는 github의 M42WebviewTableViewCell 클래스를 참조하십시오.
더 나은 접근 방식은 scrollView.contentSize.height아래와 같이 속성 을 사용하는 것입니다.
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSLog(@"%f",webView.scrollView.contentSize.height);
}
'IT TIP' 카테고리의 다른 글
| UILabel에서 텍스트의 하위 문자열에 대한 CGRect를 어떻게 찾습니까? (0) | 2020.11.04 |
|---|---|
| splatting이 rhs에 튜플을 생성하지만 lhs에 목록을 생성하는 이유는 무엇입니까? (0) | 2020.11.04 |
| 데코레이터보다 책임 체인을 사용하는 이유는 무엇입니까? (0) | 2020.11.04 |
| Criteria API를 사용하여 주문 (0) | 2020.11.04 |
| WCF 오류 "HTTP.SYS를 사용하여 HTTPS의 경우 서버 인증서가 제대로 구성되지 않았기 때문일 수 있습니다." (0) | 2020.11.04 |