2017-12-23 13 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() 
} 

のWebViewにロードされたHTMLコンテンツがあります。問題は、didEndZoomingが呼び出され、高さ制約が更新された後、正しく設定されていないことです。高さの制約はサイズまで大きくなります。 tableViewセルに高さの制約を設定すると、どうにかしてフィードバックループが作成されるように思えます。

私はどのようにこの作品を期待できますか? (それはscrollviewが無限サイズが大きくなくても、ズーム値にリサイズする必要があります。)

更新:

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 
} 

を細胞自体がXIBファイルです。私は今、ダミービューの中にビューを置く(この問題が修正されているかどうかを確認しようとしている)(ウェブビューには上下左右の辺に制約がある)制約。それは私が、セルの高さを決定するために使用しようとしていますことを、この高さの制約、webViewHeightConstraintです。

enter image description here

これは内とズームアウトの数サイクル後にログ出力されます。これは、

scrollViewDidEndZooming webView.scrollView.contentSize.height:962.0新しい高さ制約が設定される前に印刷されました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 。高さ: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 。高さ:4779.0 webViewHeightConstraint:4779.0

scrollViewDidEndZooming webView.scrollView.contentSi ze.height:109890 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

あなたに役立つ情報を掲載する必要があります。どのような制約がセルに設定されているか、あなたが何を期待しているのか、どのようなものが得られているのかなどの例です。 'フィードバックループ'を確認するにはscrollViewDidEndZoomingにいくつかのログを記録して、回。私はまた、それが設定しようとしている実際の高さを確認することをお勧めします。最後に、UIWebViewは現在廃止予定ですので、WKWebViewを調べることをお勧めします。 –

+0

ありがとう、私はいくつかの理由でUIWebViewを選択しました。しかし、もう一度WKWebViewを見ていきます。 – scord

答えて

1

として

リターンの高さではなく、これを使用してみてください:

func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) { 
    self.webHeightConstraint.constant = self.webHeightConstraint.constant * scale 

    myDelegate?.reloadTableView() 
} 

これはwebViewsのcontentSizeを参照する必要がなくなりときには、WebViewのサイズを下回らない範囲でビューをスクロールズームアウト。

WebViewのズームが表示され、終了すると新しいサイズにスナップするので、完全には機能しませんが、ズームが終了するまで何も更新されないので常にそうなります。

また、スクロールビューのminimumZoomとmaximumZoomレベルを適切に設定することを忘れないでください。

+0

にあるかもしれません。これは、スクロールビューのサイズを大きくする奇妙なフィードバックループを取り除きます。私はまだこれが起こっていることを知っていません。 – scord

+0

私はそれがcontentSizeがそのメソッドの現在のものより下になることはないが、スケールがそうするからだと思う。したがって、セルの高さが100ポイントで、ズームアウトすると0.5のスケールがレポートされることがありますが、contentSizeは100ポイントの高さを持つとレポートします。スクロールインしたときと同じ効果が得られますが、停止する前にコンテンツがセル/ Webビューの領域内に表示されます。あなたがここにいるようにセルのサイズを変更していない場合、ズームがスナップバックする方法に関連しています。 –

0

私はあなたがやっていることは全て飛行機に乗っていると感じています。問題は、高さのグローバルな配列を最初に追加すると、表のセルのデフォルトの高さが含まれていることです。グローバルそのセルと同じインデックスを持つ配列とテーブルビューをリロード、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

私はあなたがテーブルビューのセルの固定高さを与えていると思います。 UITableViewAutomaticDimension

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

元の質問では、 UITableViewCellのサイズは、それが望む方法ではなく変更されます。セルの高さがUITableViewAutomaticDimensionに設定されていない場合、セルの高さはまったく変更されません。 –

+0

しかしログ出力で、webviewの高さが更新されています 彼が戻っている高さに問題がなければ、問題はcontentSizeを参照していない制約 – Shezad

関連する問題