開発者の皆さん、Interface Builder (Xcode 5 / iOS 7) の AutoLayout で問題が起きています。これは非常に基本的で重要なので、これが適切に機能する方法を誰もが知っておくべきだと思います。これが Xcode のバグであれば、重大なものです。
そのため、次のようなビュー階層があると、必ず問題が発生します。
>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)
UIScrollView には、すべての側から 50 ピクセルなど、確実な制約があります (問題なし)。次に、UILabel に上部スペース制約を追加します (問題なし) (ラベルの高さ/幅を固定することもできます。何も変わりませんが、ラベルの固有のサイズのため不要です)
UILabel に末尾の制約を追加すると、問題が発生します。
例: 末尾のスペース: Superview 等しい: 25
ここで 2 つの警告が発生しますが、その理由はわかりません。
A)スクロール可能なコンテンツのサイズがあいまい (スクロール ビューではスクロール可能なコンテンツの高さ/幅があいまいです)
B)誤ったビュー(ラベル 予想: x= -67 実際: x= 207
この最小限の例は、ダウンロード可能な新しいプロジェクトで実行し、スクリーンショットを添付しました。ご覧のとおり、Interface Builder では、ラベルが UIScrollView の境界 (オレンジ色の破線の四角形) の外側にあることが想定されています。ラベルのフレームを Resolve Issues Tool で更新すると、ラベルがそこに移動します。
注意: UIScrollView を UIView に置き換えると、動作は期待どおりになります (ラベルのフレームは正しく、制約に従います)。したがって、UIScrollView に問題があるか、重要なことを見落としているようです。
IB の提案どおりにラベルのフレームを更新せずにアプリを実行すると、ラベルは正しい位置に配置され、UIScrollView はスクロール可能です。フレームを更新すると、ラベルは見えなくなり、UIScrollView はスクロールしません。
助けてオビ=ワン・ケノービ!なぜあいまいなレイアウトなのですか?なぜ間違った位置にビューがあるのですか?
ここからサンプル プロジェクトをダウンロードして、何が起こっているのか理解できるかどうか試してみてください。https://github.com/Wirsing84/AutoLayoutProblem
ベストアンサー1
更新しました
現在、Apple は私たちが何年も前に解決した問題に気づき (lol_face)、コンテンツ レイアウト ガイドとフレーム レイアウト ガイドをの一部として提供していますUIScrollView
。そのため、次の手順を実行する必要があります。
以下の元の回答と同じです。
このため
contentView
、スクロール ビューのコンテンツ レイアウト ガイドに固定して、上、下、左、右の余白を 0 に設定します。次に、
contentView
の高さをフレーム レイアウト ガイドの高さと同じに設定します。幅についても同様に設定します。最後に、等しい高さの制約の優先度を250に設定します(ビューを垂直方向にスクロールし、幅を水平方向にスクロールする必要がある場合)。
終了した。
これで、 にすべてのビューを追加できるようになりましたcontentView
。contentSize
のscrollView
は に応じて自動的にサイズ変更されますcontentView
。
contentView
最後のオブジェクトの下部から の余白までの制約を設定することを忘れないでくださいcontentView
。
オリジナル [非推奨]
そこで私は次のように整理しました:内に を追加
UIScrollView
しますUIView
( と呼ぶこともできますcontentView
)。この では
contentView
、上、下、左、右の余白を 0 に設定します(もちろん でscrollView
あるからsuperView
)。また、水平方向と垂直方向の中央揃えを設定します。