ストラットとスプリングのモデルを参照しているに違いないと思いますが、それらについての言及は見つかりません。NSLog
制約すると、文書化されていないクラスの説明文字列として表示されることがありますNSAutoresizingMaskLayoutConstraint
。h=---
、h=--&
、h=-&-
、水平バージョンと垂直バージョンの少なくとも 3 つの異なるタイプがあることに気付きました。
制約のあるレイアウトでデバッグする場合、それらは頻繁に表示されます。
ストラットとスプリングのモデルを参照しているに違いないと思いますが、それらについての言及は見つかりません。NSLog
制約すると、文書化されていないクラスの説明文字列として表示されることがありますNSAutoresizingMaskLayoutConstraint
。h=---
、h=--&
、h=-&-
、水平バージョンと垂直バージョンの少なくとも 3 つの異なるタイプがあることに気付きました。
制約のあるレイアウトでデバッグする場合、それらは頻繁に表示されます。
制約の代わりに自動サイズ変更マスクを指定するか、制約をまったく指定しない場合、ビューには NSLayoutConstraints ではなく NSAutoResizingMaskLayoutConstraint 制約が含まれます。に設定translatesAutoresizingMaskIntoConstraints
するNO
と、これらの制約は表示されません。1 つのビューで組み合わせて一致させることはできません。または、満足できない制約エラーが発生します。
自動サイズ変更マスクのさまざまな組み合わせを使用して簡単なテスト プロジェクトをセットアップしました。ログ形式は非常に簡単です。
h=
またはv=
、水平方向または垂直方向の制約について話していることを示します。-
固定サイズを示します&
柔軟なサイズを示しますしたがって、h=&-&
左右の余白が柔軟で幅が固定されていることをv=-&-
意味し、上下の余白が固定されていて高さが柔軟であることを意味します。
自動レイアウトをマスターするためのベスト プラクティスに関する WWDC 2012 のビデオを見ると、プレゼンターが、これは制約ではなく自動サイズ変更マスクを使用するビューの構文であると述べているセクションがあります。NSLayoutConstraint の場合のように、これらに関連付けられた視覚的な形式はありません。
jrturtonの回答に加えて、制約の説明を理解するために私が見つけた最良の情報は、コードで制約を作成するために必要なVisual Format Languageのドキュメントです。この言語は正式な文法として文書化されているため、すべてを理解するには 1 分ほどかかる場合があります。
例を挙げてください:
<NSLayoutConstraint:0x10ada8a70 H:|-(44)-[UIButton:0x10ac5dc30] (Names: '|':UIView:0x10ac60470)>
これは水平方向の制約 ( H: ) です リンケージはスーパービュー ( | ) から UIButton への 44 ピクセルです 名前付きスーパービューは 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>>