次の 2 つのビュー階層と制約のいずれかで構成されるシーンをまとめると (InterfaceBuilder で簡単に実行できます)、すべてが期待どおりに機能します...
1)
- フルスクリーン
UIScrollView
(スーパービューのすべての端までの距離が 0) - 内で、に設定され
UIScrollView
た単一の 、幅 100% (先頭と末尾の制約が 0)、高さの制約なし、膨大な量のテキスト (数千行)、定数 0 の上下の制約あり( の境界から のコンテンツ ビューまでの距離が 0 になるように)。UILabel
numberOfLines
0
UILabel
UIScrollView
動作は予想どおりです。UILabel
のコンテンツ ビューがUIScrollView
テキストに合わせて拡大され、すべてのテキストがスクロール可能になります。
2)
- 次のように、 outerView内のinnerView内
UILabel
でnumberOfLines
equal を持つA :0
UIView
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内で、 a
UILabel
が にnumberOfLines
設定され0
、テキストがロードされ、Content Compression Resistance Priority が 1000 に設定されます。
前の 2 つのテスト ケースに基づく私の予想では、UIScrollView
のコンテンツ ビューは、ラベルのテキストに合わせてサイズ変更する必要があります。ただし、代わりに、コンテンツ ビューがinnerViewとUIScrollView
同様に のサイズに設定され、はスクロールできません。UIScrollView
前の 2 つのテスト ケースと矛盾するこの動作が発生するのはなぜですか?また、コンテンツの圧縮耐性を機能させ、アンダー オートレイアウトUILabel
内のビューにネストするときに、尊重されている固有のコンテンツ サイズを取得するにはどうすればよいですか? 最初のケースとまったく同じように、圧縮せずにすべての制約を満たすことが完全に可能である場合、3 番目のケースでUIScrollView
autolayout が my を圧縮する理由はわかりません。UILabel