IT TIP

가변 높이 UITableView 내에서 콘텐츠를 기반으로 UIWebView 높이를 결정하는 방법은 무엇입니까?

itqueen 2020. 11. 4. 21:05
반응형

가변 높이 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);   
}

참고URL : https://stackoverflow.com/questions/745160/how-to-determine-uiwebview-height-based-on-content-within-a-variable-height-uit

반응형