2017-12-23 13 views
2

Ich versuche, die Höhe einer Tabellenansichtszelle an die Höhe einer UIWebView Bildlaufansicht nach dem Zoomen anzupassen. Die UIWebView ist eine Unteransicht der Tabellenansichtszelle .Aktualisierungsbedingung in UITableViewCell funktioniert nicht richtig mit UIWebView scrollView beim Zoomen

auf

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() 
    } 
} 

In geordneten Controller:

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

Es gibt HTML-Inhalte auf dem webview geladen. Das Problem ist, nachdem didEndZooming aufgerufen und die Höhenbeschränkung aktualisiert wurde, wird es nicht richtig eingestellt. Die Höhenbeschränkung wird bis zur Größe zunehmen. Es scheint mir, dass das Setzen einer Höhenbeschränkung in einer TableView-Zelle irgendwie eine Feedback-Schleife erzeugt.

Wie kann ich das so machen, wie ich es erwarte? (Es sollte die Scrollview, ohne dass der gezoomte Wert der Größe in der Größe unbegrenzt wachsen.)

Update: in

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 
} 

Die Zelle selbst in einer xib Datei. Ich habe die Ansichten in eine Dummy-Ansicht eingefügt (versuche zu sehen, ob dies mein Problem behoben hat.) Die Web-Ansicht hat Beschränkungen für die oberen, unteren, linken und rechten Kanten. Die Webansicht hat auch eine Höhe Einschränkung. Es ist diese Höhe Einschränkung, webViewHeightConstraint, dass ich die Höhe der Zelle zu verwenden, versuchen zu bestimmen.

enter image description here

Dies ist die Protokollausgabe nach wenigen Zyklen von ein- und Auszoomen. Dies ist gedruckt, bevor die neue Höhenbeschränkung gesetzt:

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: 1.531,0 webViewHeightConstraint: 962,0

scrollViewDidEndZooming webView.scrollView.contentSize .height: 1.549,0 webViewHeightConstraint: 1531,0

scrollViewDidEndZooming webView.scrollView.contentSize.height: 2.566,0 webViewHeightConstraint: 1549,0

scrollViewDidEndZooming webView.scrollView.contentSize.height: 2.566,0 webViewHeightConstraint: 2566,0

scrollViewDidEndZooming webView.scrollView.contentSize.height: 4.779,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: 10.989,0 webViewHeightConstraint: 10989,0

scrollViewDidEndZooming webView.scrollView.contentSize.height: 25.110,0 webViewHeightConstraint: 10989,0

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

+1

Sie sollten mehr Code innerhalb der 'tableView (_: cellForRowAt:)' Methode bereitstellen, wie Ihre 'tableViewCell' aussieht und was' webViewHeightConstraint' ist. Es ist einfacher und schneller, Ihnen zu helfen, wenn wir ein Debug Repo haben können. – trungduc

+1

Sie sollten einige weitere Informationen veröffentlichen, um uns zu helfen, z. Welche Einschränkungen sind in der Zelle eingerichtet, ein Beispiel für das, was Sie erwarten und was Sie bekommen, usw. Wenn Sie nach einer "Feedback-Schleife" suchen wollen, dann machen Sie eine Protokollierung in scrollViewDidEndZooming, um zu sehen, ob tatsächlich mehrere ausgeführt werden mal. Ich würde auch vorschlagen, die tatsächliche Höhe, die es einzustellen versucht, zu überprüfen. Schließlich ist UIWebView derzeit veraltet, daher würde ich vorschlagen, in WKWebView zu schauen. –

+0

Danke, ich habe UIWebView aus verschiedenen Gründen gewählt. Aber ich werde noch einmal auf WKWebView schauen. – scord

Antwort

1

Versuchen Sie stattdessen mit:

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

    myDelegate?.reloadTableView() 
} 

Dies vermeidet die Content der WebViews blättern Ansicht zu verweisen, wie das nicht unter der webView Größe geht, wenn rauszoomen.

Jetzt funktioniert es nicht perfekt, weil Sie sehen, dass das webView in sich selbst hineinzoomt und dann auf die neue Größe schnappt, wenn Sie fertig sind, aber es wird immer so sein, da nichts aktualisiert wird, bis das Zoomen beendet ist.

Vergessen Sie auch nicht, die minimumZoom- und maximumZoom-Ebenen der Bildlaufansicht entsprechend einzustellen.

+0

sein, die nicht auf die Funktion contentSize verweist. Es wird die seltsame Rückkopplungsschleife los, die die Größe der Bildlaufansicht vergrößert hat. Ich weiß immer noch nicht, warum das passiert ist. – scord

+0

Ich denke es liegt daran, dass die contentSize nie unter das Niveau der Methode geht, aber die Skalierung. Wenn Ihre Zelle also 100 Punkte hoch ist und Sie auszoomen, wird möglicherweise eine Skalierung von 0,5 angezeigt, die Inhaltsgröße wird jedoch weiterhin mit einer Höhe von 100 Punkten gemeldet. Sie können den Effekt sehen, wenn Sie scrollen, aber bevor Sie anhalten, können Sie sehen, dass der Inhalt in den Bereich der Zellen-/Webansicht gelangt. Es hängt damit zusammen, wie das Zoomen zurückspringt, wenn Sie die Zellengröße nicht wie hier ändern. –

0

Ich fühle, dass alles, was Sie tun, ist im Vorbeigehen und es ist das Problem, fügen Sie besser ein globales Array von Höhen enthält zunächst die Standardhöhe für die Tabellenzelle, jedes Mal, wenn eine bestimmte Webansicht zommed ist, ändern Sie den entsprechenden Wert in der globaler Array mit dem gleichen Index wie die, dass die Zelle und die Tableview neu zu laden, als IBOutlet

und tut dies in cellForRowAt die tableViewCell Höhe Haken

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

vergessen Sie nicht, diese Zeilen vor Rückkehr Zelle zu setzen

cell.layoutSubviews() 

cell.layoutIfNeeded() 

return cell 

Ich erwarte von Ihrem Problem, dass Sie dynamische TabelleViewCell Höhe

+0

Welche Werte setzen Sie in dieses globale Array? Woher kennen Sie sie im Voraus? Das ursprüngliche Problem ist, dass das UIWebView vom Benutzer gezoomt wird, so dass die endgültige Höhe wirklich alles sein kann. –

+0

Ich meine initial Höhe Werte für jede Zelle, sie werden Standardwerte sein, wenn statisch oder wenn er dynamische verwendet wird auf aktuelle xib Höhe gesetzt, wenn Zoom passiert er Rahmen bekommt und setzen Sie es auf entsprechende Index –

+0

Alles passiert in der Zelle selbst. Das UIWebView ist eine Unteransicht der Zelle. Wenn das UIWebView aufhört zu zoomen, sollte die Höhe dieser bestimmten Zelle aktualisiert werden (was nicht funktioniert). Wenn sich das UIWebView beispielsweise in Zelle 3 befindet und gezoomt wird, sollte die Größe von Zelle 3 geändert werden. Die Größe, die für die Größe benötigt wird, stammt aus dem UIWebView und bezieht sich nicht auf ein Array von Größen für die Zellen. –

0

ich denke, Sie geben eine feste Höhe für Tableview-Zelle.

Rückkehr Höhe wie UITableViewAutomaticDimension

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

Nö konnte es dieses Problem nicht sein, weil die ursprüngliche Frage dass das anzeigt Größe der UITableViewCell ändert sich nur nicht, wie es gehofft wurde. Wenn die Höhe für Zellen nicht auf UITableViewAutomaticDimension festgelegt wurde, wird sie sich überhaupt nicht ändern. –

+0

Aber in der Protokollausgabe wird die Höhe der Webansicht aktualisiert , wenn es nicht das Problem mit der Höhe ist, die er zurückgibt, dann könnte das Problem auf die Einschränkungen – Shezad

Verwandte Themen