Struts and Springsモデルを参照する必要があると思いますが、それらについての言及はありません。 NSLog
制約を設定すると、ドキュメント化されていないクラスNSAutoresizingMaskLayoutConstraint
の説明文字列として表示されることがあります。少なくとも3つの異なるタイプに気づきました:h=---
、h=--&
、h=-&-
水平バージョンと垂直バージョン。
制約されたレイアウトをデバッグするときに、それらは非常に多くなります。
制約の代わりに自動サイズ変更マスクを指定するか、制約をまったく指定しない場合、ビューにはNSLayoutConstraintsではなくNSAutoResizingMaskLayoutConstraint制約があります。 translatesAutoresizingMaskIntoConstraints
をNO
に設定すると、これらの制約は表示されません。単一のビューで組み合わせて一致させることはできません。または、満足できない制約エラーが発生します。
自動サイズ変更マスクのさまざまな組み合わせを使用して簡単なテストプロジェクトを設定しました。ログ形式は非常に簡単です。
h=
またはv=
は、水平方向または垂直方向の制約について話していることを示します。-
は固定サイズを示します&
はフレキシブルサイズを示しますしたがって、h=&-&
は、左右のマージンがフレキシブルで、幅が固定されていることを意味しますv=-&-
は、上下のマージンが固定され、高さがフレキシブルであることを意味します。
自動レイアウトのマスタリングのベストプラクティスに関するWWDC 2012ビデオを見ると、プレゼンターがこれが自動サイズ変更マスクを使用し、制約ではないビューの構文であると述べているセクションがあります。 NSLayoutConstraintの場合のように、これらに関連付けられた視覚的な形式はありません。
Jrturtonの答えに加えて、制約の説明を理解するために私が見つけた最良の情報は、コードで制約を作成するために必要なVisual Format Languageのドキュメントです。言語は正式な文法として文書化されているため、すべてを吸収するには1分ほどかかる場合があります。
例を挙げましょう:
<NSLayoutConstraint:0x10ada8a70 H:|-(44)-[UIButton:0x10ac5dc30] (Names: '|':UIView:0x10ac60470)>
これは水平方向の制約です(H:)リンケージはスーパービューから44ピクセルです(| )からUIButtonへの名前付きスーパービューはUIViewです(Names: '|':UIView:)—する必要がないため、知っておくことが重要です即時のスーパービューによる制約
16進値はすべて、UI要素の有効なアドレスです。すべての例外でブレークポイントを設定し、制約の競合で一時停止すると、poアドレスを使用して制約のオブジェクトを確認できます。私の場合:
(lldb) po 0x10ac5dc30
<UIButton: 0x10ac5dc30; frame = (44 199; 30 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x10ac5ddf0>>
(lldb) po 0x10ac60470
<UIView: 0x10ac60470; frame = (0 64; 320 504); autoresize = RM+BM; animations = { position=<CABasicAnimation: 0x10ac5ec70>; bounds=<CABasicAnimation: 0x10ac62250>; }; layer = <CALayer: 0x10ac60530>>