3

次の 2 つのビュー階層と制約のいずれかで構成されるシーンをまとめると (InterfaceBuilder で簡単に実行できます)、すべてが期待どおりに機能します...


1)

  • フルスクリーンUIScrollView(スーパービューのすべての端までの距離が 0)
  • 内で、に設定されUIScrollViewた単一の 、幅 100% (先頭と末尾の制約が 0)、高さの制約なし、膨大な量のテキスト (数千行)、定数 0 の上下の制約あり( の境界から のコンテンツ ビューまでの距離が 0 になるように)。UILabelnumberOfLines0UILabelUIScrollView

動作は予想どおりです。UILabelのコンテンツ ビューがUIScrollViewテキストに合わせて拡大され、すべてのテキストがスクロール可能になります。


2)

  • 次のように、 outerView内のinnerViewUILabelnumberOfLinesequal を持つA : 0UIView UIView
    • ラベルのエッジはすべて、innerViewのエッジからの距離が 0 です (優先度 1000)
    • innerViewのエッジはすべて、outerViewのエッジからの距離が 0 です (優先度 1000)
    • outerViewの上部、前縁、後縁はすべて、スーパービューからの距離が 0 です (優先度 1000)
    • outerViewの高さは、スーパービューの高さ全体よりも低く、高さの制約または下部からスーパービューまでの距離の制約によって強制されますが、この最後の制約の優先度は低く、たとえば 600 です。

この場合も、動作は期待どおりです。UILabelの Content Compression Resistance Priority が 600 より大きい場合、outerViewの高さはすべてのテキストに合わせて増加し、それより低い場合はラベルが切り詰められます。


ただし、次のケースは、他の 2 つとまったく同じように見えますが、期待どおりには機能しません。

3)

  • UIScrollView最初のケースのようなフルスクリーン
  • 内で、すべてのエッジが のエッジからの距離が 0 でUIScrollViewあるUIView innerViewUIScrollView (2 番目のケースのように)。
  • innerView内で、 aUILabelが にnumberOfLines設定され0、テキストがロードされ、Content Compression Resistance Priority が 1000 に設定されます。

前の 2 つのテスト ケースに基づく私の予想では、UIScrollViewのコンテンツ ビューは、ラベルのテキストに合わせてサイズ変更する必要があります。ただし、代わりに、コンテンツ ビューがinnerViewUIScrollView同様に のサイズに設定され、はスクロールできません。UIScrollView

前の 2 つのテスト ケースと矛盾するこの動作が発生するのはなぜですか?また、コンテンツの圧縮耐性を機能させ、アンダー オートレイアウトUILabel内のビューにネストするときに、尊重されている固有のコンテンツ サイズを取得するにはどうすればよいですか? 最初のケースとまったく同じように、圧縮せにすべての制約を満たすことが完全に可能である場合、3 番目のケースでUIScrollViewautolayout が my を圧縮する理由はわかりません。UILabel

4

1 に答える 1