2016-10-17 10 views
0

この動作をテストする簡単なアプリケーションは、コードは次のとおりです。のUIWebViewデリゲートと非同期ロード

func webViewDidFinishLoad(_ webView: UIWebView) 
{ 
    print(webView.scrollView.contentSize.height) 
    webViewHeight.constant = webView.scrollView.contentSize.height 
    self.view.setNeedsUpdateConstraints() 
    self.view.setNeedsLayout() 
    self.view.layoutIfNeeded() 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    webView.loadHTMLString(htmlstring, baseURL: nil) 
    webView.delegate = self 
    // Do any additional setup after loading the view, typically from a nib. 
} 

<blockquote class=\"instagram-media\" data-instgrm-captioned data-instgrm-version=\"7\" style=\" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);\"><div style=\"padding:8px;\"> <div style=\" background:#F8F8F8; line-height:0; margin-top:40px; padding:50.0% 0; text-align:center; width:100%;\"> <div style=\"background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAMUExURczMzPf399fX1+bm5mzY9AMAAADiSURBVDjLvZXbEsMgCES5/P8/t9FuRVCRmU73JWlzosgSIIZURCjo/ad+EQJJB4Hv8BFt+IDpQoCx1wjOSBFhh2XssxEIYn3ulI/6MNReE07UIWJEv8UEOWDS88LY97kqyTliJKKtuYBbruAyVh5wOHiXmpi5we58Ek028czwyuQdLKPG1Bkb4NnM+VeAnfHqn1k4+GPT6uGQcvu2h2OVuIf/gWUFyy8OWEpdyZSa3aVCqpVoVvzZZ2VTnn2wU8qzVjDDetO90GSy9mVLqtgYSy231MxrY6I2gGqjrTY0L8fxCxfCBbhWrsYYAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-22px; width:44px;\"></div></div> <p style=\" margin:8px 0 0 0; padding:0 4px;\"> <a href=https://www.instagram.com/p/BLpA4TKAdPr/ style= \" color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;\" target=\"_blank\"></p></div></blockquote> <script async defer src=\"http://platform.instagram.com/en_US/embeds.js\"></script> 

を次のようにhtmlstringがある(それはInstagramの埋め込みです)

さて、問題は、あなたがこのwebViewDidFinishLoadが複数回トリガされます試してみて、実行した場合、それはもちろん期待できますですしかし、それが完了した後でも、エンベッドが途切れて表示されるため、結果として得られる高さはまだ間違っています

the result

私は絵がAJAXや高さが(いなくても、キャプション可能性と?)を撮影されていないアカウントに私の質問がある

この時点で意味似たような、を経由して、後にロードされているためであると仮定します私が変更できないこの特定のタイプのコンテンツでは、プロセスが本当に終了してWebViewの正しいサイズになったときをどうすればわかりますか?

答えて

0

我々はBrave.appでscrollviewのコンテンツサイズの変更を見る:

webView.scrollView.addObserver(self, forKeyPath: "contentSize", options: .New, context: nil) 

と受信機:このコードは我々のアプリに座っているのはここ

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
    if keyPath == "contentSize" { 
    // should give you correct height 
     print(webview.scrollView?.contentSize.height) 
    } 
} 

は次のとおりです。 https://github.com/brave/browser-ios/blob/d9b5500de863625fc4e7f1ade8f6c428842f3063/brave/src/frontend/BraveScrollController.swift#L195

+0

感謝を私はすぐにそれを試してみます。これは複数のUIWebViewで動作しますか?残念ながら、クライアントは、これらの埋め込みを数百のインスタンスを持つテーブルビューの中に配置することを望んでいます(それはひどいのですが、私は知っています) –

+0

ええ、私たちはアプリで複数のWebviewを持っています。 キーパスの観測には、次のような送信オブジェクトを示す機能があります。 'webView1.scrollView.addObserver(...); webView2.scrollView.addObserver(...) ' およびobserveValueForKeyPath(..):' if object == webView1 {dosomething} ' –

関連する問題