web-dev-qa-db-ja.com

iOS 6の自動レイアウトを使用した動的UIViewの高さ

最後の数日間、私は自動レイアウト制約を使用してかなりシンプルな(少なくともそうあるべきです)レイアウトを達成しようとしていますが、成功していません。

私のビュー階層は:
UIScrollView
-UIView(コンテナビュー)
----- UILabel(複数行ラベル)
----- UIWebView
----- UILabel
----- UIButton

View hierarchy in IB

望ましい機能は、コンテンツのサイズに応じて拡大されるコンテナビューです。 UIWebViewの高さを増やすために、次のコードを使用します。

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView sizeToFit];
} 

私は多くの異なる制約を試しましたが、最も合理的な制約は次のとおりです。
1。 1番目のラベル(イベントタイトル)のスーパービューの上部スペースを固定します
2。最初のラベルとUIWebViewのピンの垂直間隔
3。残りの要素の垂直方向のピン間隔(つまり、UIWebView-UILabel(イベント日付)およびUILabel(イベント日付)-UIButton)
4。コンテナビューの優先度が低い(1)スーパービューの下部の垂直方向のスペース制約

私が得る結果は次のとおりです。 enter image description here

UIWebViewは展開されますが、イベントの日付ラベルとボタンはプッシュダウンされず、コンテナビューも展開されません。

どんな助けも大歓迎です。

サンプルXcodeプロジェクトをダウンロードできます こちらから

30
Gerhat

WebViewの高さ制限を266に設定しています。そのため、Webビューの高さは依然として固定されています。

この高さ制約をIBOutletとして作成できます。次に例を示します。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *webViewHeightConstraint;

そして、Webビューがコンテンツのダウンロードを完了したら、高さの制約の定数を変更できます。 Webビュー自体は内部のスクロールビューで構成されているため、コンテンツの全体の高さを取得する場合:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    self.webViewHeightConstraint.constant = self.webView.scrollView.contentSize.height;
}

または、明らかにこれも機能します:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView sizeToFit];
    self.webViewHeightConstraint.constant = self.webView.frame.size.height;
}
71
Valent Richie

WebViewコンテンツサイズを更新する前に遅延が必要になる場合があります。 masonry は、自動レイアウトの使用に役立ちます。

-(void)webViewDidFinishLoad:(UIWebView *)webview{
    [self performSelector:@selector(checkContentOnDelay:) withObject:webview afterDelay:0.001];
}

-(void)checkContentOnDelay:(UIWebView *)webview{
    CGSize contentSize = webview.scrollView.contentSize;
    if (contentSize.height > 2) {
        [webview updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(contentSize.height);
        }];
    }else{
        [self performSelector:@selector(checkContentOnDelay:) withObject:webview afterDelay:0.01];
    }
}
1
ymutlu