2013-09-27 9 views
10

サブビューとしてUIImageViewと複数行のUILabelを持つカスタムコンテナビューを作成しようとしています。自動レイアウトとうまくビューを機能させるために、私は以下のようにintrinsicContentSizeをオーバーライドしています:intrinsicContentSizeを使用する動的な高さのUIView

- (CGSize)intrinsicContentSize 
{ 
    return [self sizeThatFits:self.bounds.size]; 
} 

sizeThatFitsに計算されたサイズは同じ幅を有し、ラベルとイメージがクリップされないように高さを調整します。これはうまく動作しますが、私は次のコメントのドキュメントで見て驚きました:動的に基づいて、レイアウトシステムに変更された幅を通信する方法はありませんので、この本質的なサイズは、コンテンツフレームの独立していなければならない

例えば、変更された高さ。

この場合、幅と内容に基づいてビューの現在の高さを調整する自動レイアウト方法は何ですか?私はこれとは別の方法で接近すべきでしょうか?

+0

コンテンツがクリップされないようにするには、コンテナビューの圧縮抵抗の優先順位を上げる必要があります。 –

+1

圧縮抵抗は、ビューがその固有のコンテンツサイズよりも小さくされるのを防ぐための優先順位です。本質的なコンテンツのサイズが正しくない場合、これはあまり使用されません。 – Tark

答えて

4

私自身の質問に答えるには、この状況に対して適切な自動レイアウトがないようです。インスピレーションのためにUILabelを見ると、本質的なコンテンツサイズ計算中に制約幅として使用できるプロパティpreferredMaxLayoutWidthを追加することで、ここでの問題を解決しました。任意のカスタムビューは、同様のものを使用する必要があります。

+0

はい、それを達成するためのAutolayoutの助けはほとんどないようです。 答えでは、 'preferredMaxLayoutWidth> 0.0f'のときにビューの幅を制限し、文字通りそれ以外の場合は制限しないというアプローチについて考えるようになりました。固有のコンテンツサイズの計算で幅に大きな浮動小数点(例:99999.0f)を使用します。 –

1

あなたのcontainerViewはコンテンツフレームとしてplaceHolderFrameを持っている可能性があります。

本来のサイズは、コンテンツフレームに関連するものではなく、それ自身のサブコンテンツに関連するものである必要があります。 例えばあなたの画像とUILabel。

ラベルと画像の高さと幅の両方を計算する必要があります。 これらはすべて本質的なサイズを持つため、簡単にすべきです。

ちょうど私の意見...

+3

placeHolderFrameとは何ですか?その点については、コンテンツフレームとは何ですか?ラベルは複数行のラベルですが、最初にテキストの折り返し幅を知ることなく高さを知ることはできません。 – Tark

0

私はあなたが正しくラベルのレイアウトや他のものをレイアウトするために他のアプローチを使用するようにUILabelの新しいpreferredMaxLayoutWidthプロパティを使用することができると思います。このような

何か:

- (void)layoutSubviews 
{ 
    ... 
    [super layoutSubviews]; // get width from solved constraints 
    label.preferredMaxLayoutWidth = label.frame.size.width; // use it 
    [super layoutSubviews]; // update height of a label (probably intrinsicContentSize) 
    ... 
} 
+0

ここで問題となるのは、ビューを正しくレイアウトする方法ではなく、ビューの本来の高さをレイアウトシステムに伝え、その内容に応じて正しい高さが与えられるようにすることです。 – Tark

+0

内在的な内容について私が指摘しているのは、ラベルのサイズです。preferredMaxLayoutWidthを使用すると、より自動レイアウトに対応した方法で更新できます(おそらく、アップルが何をするのかを示唆しています)。 –

関連する問題