2017-12-23 36 views
2

UIWebView 스크롤 뷰의 높이와 일치하도록 테이블 뷰 셀의 높이를 업데이트하려고합니다. UIWebView은 테이블 뷰 셀의 하위 뷰입니다 . 상위 제어기에서확대/축소시 UITableViewCell의 제약 조건 업데이트가 UIWebView scrollView에서 제대로 작동하지 않습니다.

func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) { 
    DispatchQueue.main.async { 
     print("\nscrollViewDidEndZooming") 
     print("webView.scrollView.contentSize.height: \(self.webView.scrollView.contentSize.height)") 
     print("webViewHeightConstraint: \(self.webViewHeightConstraint.constant)") 

     let height = self.webView.scrollView.contentSize.height 
     self.webViewHeightConstraint.constant = height 
     myDelegate.reloadTableView() 
    } 
} 

:

func reloadTableView() { 
    tableView.beginUpdates() 
    tableView.endUpdates() 
} 

웹보기에로드 된 HTML 내용이 있습니다. 문제는 didEndZooming이 호출되고 높이 제약 조건이 업데이트 된 후 제대로 설정되지 않는 것입니다. 높이 제한은 크기가 커질 때까지 증가합니다. tableView 셀에서 높이 제한을 설정하는 것은 어떻게 든 피드백 루프를 만드는 것으로 보입니다.

어떻게하면 좋을까요? (그것은있는 ScrollView의 크기는 무제한의 성장없이 확대 된 값으로 크기를 조정해야합니다.)

업데이트 : 자체가 XIB 파일에 셀

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: WebViewCell.description(), for: indexPath) as! WebViewCell 

    //The cell delegate implements the didFinishLoad() function 
    cell.delegate = self 

    //TODO: I know this is not efficient, will update later. 
    if let html = viewModel.emailInfo?.htmlContent { 
     cell.loadHTMLString(html) 
    } 

    return cell 
} 

있다. 난 지금은 더미 뷰의 내부보기를 넣어 (이 문제가 해결되지 않았는지 확인하려고합니다.) 웹 뷰는 위쪽, 아래쪽, 왼쪽 및 오른쪽 가장자리에 제약 조건이 있습니다. 또한 웹 뷰의 높이 제약. 내가 셀의 높이를 결정하는 데 사용하기 위해 노력하고 있음을,이 높이 제한, webViewHeightConstraint입니다.

enter image description here

이 확대 및 축소의 몇 사이클 후 로그 출력됩니다.이다 새로운 높이 제한이 설정되기 전에 인쇄됩니다.

scrollViewDidEndZooming webView.scrollView.contentSize.height : 962.0,210 webViewHeightConstraint : 509.0

scrollViewDidEndZooming webView.scrollView.contentSize.height : 962.0 webViewHeightConstraint : 962.0

scrollViewDidEndZooming webView.scrollView.contentSize.height : 1531.0 webViewHeightConstraint : 962.0

scrollViewDidEndZooming webView.scrollView.contentSize .height : 1549.0 webViewHeightConstraint : 1531.0

scrollViewDidEndZooming webView.scrollView.contentSize.height : 2566.0,webViewHeightConstraint : 1549.0

scrollViewDidEndZooming webView.scrollView.contentSize.height : 2566.0 webViewHeightConstraint : 2566.0

scrollViewDidEndZooming webView.scrollView.contentSize.height : 4779.0 webViewHeightConstraint : 2566.0

scrollViewDidEndZooming webView.scrollView.contentSize .height : 4779.0 webViewHeightConstraint : 4779.0

scrollViewDidEndZooming webView.scrollView.contentSi ze.height : 10989.0 webViewHeightConstraint : 4779.0

scrollViewDidEndZooming webView.scrollView.contentSize.height : 10989.0 webViewHeightConstraint : 10989.0

scrollViewDidEndZooming webView.scrollView.contentSize.height : 25110.0 webViewHeightConstraint : 10989.0

scrollViewDidEndZooming webView.scrollView. contentSize.height : 25110.0 webViewHeightConstraint : 25110.0

+1

'tableView (_ : cellForRowAt :)'메소드 안에 더 많은 코드를 제공해야한다.'tableViewCell'의 모양과'webViewHeightConstraint'는 무엇인가? 디버그 저장소가 있으면 쉽고 빠릅니다. – trungduc

+1

예를 들어 Google에 도움이되는 몇 가지 정보를 게시해야합니다. 어떤 제약 조건들이 셀에 설정되어 있는지, 당신이 기대하는 것과 당신이 얻고있는 것을 보여주는 예입니다. '피드백 루프'를 확인하려면 scrollViewDidEndZooming에 로깅을 넣어 실제로 다중을 수행하는지 확인하십시오 타임스. 나는 또한 설정하려고하는 실제 높이를 확인하는 것이 좋습니다. 마지막으로 UIWebView는 현재 사용되지 않으므로 WKWebView를 살펴볼 것을 제안합니다. –

+0

감사합니다. 몇 가지 이유로 UIWebView를 선택했습니다. 그러나 WKWebView를 다시 살펴 보겠습니다. – scord

답변

1

이 대신 사용해보십시오 :

이것은 webViews의 contentSize을 참조하는 것을 피한다
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) { 
    self.webHeightConstraint.constant = self.webHeightConstraint.constant * scale 

    myDelegate?.reloadTableView() 
} 

가보기를 스크롤 즉, 웹보기 크기 때 아래로 이동하지 않는 한 축소.

WebView가 자체적으로 확대 된 것을보고 나서 끝내면 새 크기로 스냅되기 때문에 완벽하게 작동하지 않지만 축소가 완료 될 때까지 아무것도 업데이트되지 않으므로 항상 그렇게됩니다.

또한 스크롤 뷰의 minimumZoom 및 maximumZoom 수준을 적절하게 설정해야합니다.

+0

에있을 수 있습니다. 스크롤 뷰를 크기가 커지게 만드는 이상한 피드백 루프를 제거합니다. 나는 아직도 비록 이것이 일어나고 있는지 알지 못한다. – scord

+0

나는 contentSize가 이제는 그 방법에있는 것이 아니라 스케일이 결코 밑으로 가지 않기 때문이라고 생각합니다. 따라서 셀의 높이가 100이고 높이를 축소하면 0.5의 눈금을 표시 할 수 있지만 여전히 100 점의 높이를 갖는 것으로 contentSize를보고합니다. 스크롤 할 때 효과를 볼 수 있지만 중지하기 전에 셀/웹보기 영역 내에서 내용을 볼 수 있습니다. 여기에있는 것처럼 셀 크기를 변경하지 않으면 확대/축소 기능이 다시 작동하는 것과 관련이 있습니다. –

0

나는 당신이하는 일이 비행 중에 있다는 것을 느낀다. 그리고 문제가있다. 처음에는 표 셀의 기본 높이가 포함 된 전체 높이 배열을 추가하는 것이 좋다. 특정 웹뷰가 변경 될 때마다 해당 값이 같은 인덱스와 글로벌 어레이 해당 셀과의의 tableview를 다시로드 함께 IBOutlet

을 tableViewCell 높이 후크와 cellForRowAt에서이 작업을 수행

cell.heightConOfCell.constant = #coressponding value in global array# 

는 반환 세포

전에 라인에 다음을 넣어하는 것을 잊지 마세요
cell.layoutSubviews() 

cell.layoutIfNeeded() 

return cell 

당신의 문제에서 동적 tableViewCell 높이를 사용하고 있습니다.

+0

이 전역 배열에 어떤 값을 넣습니까? 미리 어떻게 알았습니까? 원래 문제는 UIWebView가 사용자에 의해 확대되어 최종 높이가 실제로 무엇이든 될 수 있다는 것입니다. –

+0

모든 셀의 실제 높이 값을 의미합니다. 정적 인 경우 또는 동적을 사용하는 경우 현재 xib 높이로 설정 될 때 기본값이됩니다. 줌이 발생할 때마다 프레임을 가져 와서 해당 인덱스로 설정합니다. –

+0

셀 내부에서 모든 것이 발생하고 있습니다. 그 자체. UIWebView는 셀의 하위 뷰입니다. UIWebView 확대/축소가 끝나면 특정 셀의 높이가 업데이트되어야합니다 (즉, 작동하지 않는 부분). 예를 들어 UIWebView가 셀 3에 있고 확대 된 경우 셀 3의 크기가 조정되어야합니다. 크기를 조정하는 데 필요한 높이는 UIWebView에서 가져온 것으로, 어쨌든 셀의 크기 배열과 관련이 없습니다. –

0

나는 당신이 tableview 셀에 고정 된 높이를 부여한다고 생각합니다.

반환 높이 UITableViewAutomaticDimension로

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 
+0

아니요. 원래 질문에 UITableViewCell의 크기는 바뀌었을뿐입니다. 셀의 높이가 UITableViewAutomaticDimension으로 설정되지 않은 경우 전혀 변경되지 않습니다. –

+0

그러나 로그 출력에서 ​​웹보기의 높이가 으로 업데이트되는데 높이가 문제가되지 않으면 문제가 contentSize를 참조하지 않는 제약 – Shezad