2013-07-07 17 views
29

私はかなり単純なレイアウトを達成しようとしていますが、自動レイアウトの制約を使用しても、成功することはありません。iOS 6の自動レイアウトで動的なUIViewの高さ

マイビューの階層は次のとおりです。
UIScrollViewの
- のUIView(コンテナビュー)
----- UILabel(複数行のラベル)
-----のUIWebView
----- UILabel
----- UIButton

View hierarchy in IB

所望functionallityは容器Vでありますコンテンツのサイズに応じて拡大表示されます。 (
1.ピントップスペーススーパービューから第一のラベルのためのイベントを:最も合理的なものがあることで、私は多くの異なる制約を試してみました

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

:私は、次のコードを使用してのUIWebViewの高さを増加させるために、タイトル)第一のラベルとのUIWebViewのため
2.ピンの垂直間隔
残りの要素のための 3.ピンの垂直間隔(すなわちのUIWebView - UILabel(イベント日付)とUILabel(イベント日付) - UIButton)
4.コンテナビューの優先度が低い(1)スーパービューの下限垂直スペース制約

私が得る結果は以下の通りです: enter image description here

のUIWebViewが拡大するが、イベントの日付ラベルやボタンを押し下げていない、プラスコンテナビューはどちらか展開されません。

ご協力いただければ幸いです。

あなたがサンプルのXcodeプロジェクトfrom here.

答えて

71

あなたはWeb表示の高さは、まだ固定されている理由です266としてあなたのWebViewの高さcontraintを設定しているをダウンロードすることができます。

次の例のように、IBOutletとして、この高さの制約を作成することができます

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

をし、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; 
} 
+1

お返事ありがとうございます。それは魅力のように働いた! – Gerhat

+1

私はこの100万回upvoteすることができたら...あなたの答えはちょうど私のキーボードで頭を叩いて4時間を終えた。 – shulmey

+0

私ははるかに単純な問題を抱えており、それを働かせることはできません。これは、「メイン」ビューの 'Scroll View'の' Content View'の 'Label'だけで、' label.frame.size.height'に制約を設定していますが、そうではありませんワーキング。私が理解しているように、 'contentSize'は自動的に「成長」する必要があります。ここでコードしてください:http://loessl.org/~hashier/relpub_2/DynLabel.zip – hashier

1

あなたが前の遅延を必要とするかもしれないあなたは、コンテンツの全体の高さを取得したいのであれば、ウェブビュー自体は、内部のスクロールビューで構成されていウェブビューのコンテンツサイズを更新しています。 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]; 
    } 
} 
関連する問題