2013-10-30 1 views
11

スプリングと構造体レイアウトから自動レイアウトに移行し始め、「組み込みサイズ」の設定に関するいくつかの質問があります。本来のサイズとシステムの幅/高さの制約の違いは何ですか?

一部のビューの「組み込みサイズ」を「プレースホルダ」に設定して幅と高さの値を設定すると、ビューは縮尺されず固定サイズのままになります。しかし、 "Intrinsic Size"を "Default(System defined)"に設定すると、システムは実行時に必要に応じてビューを決定し、スケーリングします。

ただし、Ctrl +ドラッグを使用すると、ビューに幅と高さのシステム制約を明示的に設定できます。そのような場合、システムの幅と高さの制約とconstプレースホルダの値があります。私は既存のコードを見直しています。それはバグであり、冗長なシステム幅と高さの制約を取り除かなければならないか、あるいは他の隠れたロジックがあることを理解しようとしています。しかし、Xcodeは実行時にコンソールに警告などを表示しません。ここでは、デモプロジェクトの印刷画面です:

enter image description here

答えて

26

ラベルをすることができように、「プレースホルダ」は、あなたが(あなたのビューは、その内容に応じて大きさを持つことになりますXcodeのレイアウトシステムに伝えるために本来のサイズを設定すると、そのテキスト内容に依存する)。システムは、本質的なサイズのビューのみを認識し、保持します。あなた自身のビューで似たような経験をしたい場合は、ビューが本質的なサイズを持っているかのように考えてください。次に、その内容に応じてビューを拡大または縮小するかのように、制約を設定します。最後に、intrinsicContentSizeメソッドを実装して、コンテンツの正しいサイズを計算して返します。コンテンツが変更され、新しい計算を実行する必要がある場合は、invalidateIntrinsicContentSizeに電話してください。制約をどのように設定したかによって、ビューは拡大または縮小されるか、静的になります(ラベルに幅と高さの制約を設定でき、静的なままです)。

+0

Hmm、 "Placeholder"をカスタムの幅と高さに設定しても、UILabelの内容(「コンテンツに依存します」)は変化しません。 – Centurion

+0

幅と高さの制約を追加すると、ラベルの縮尺は変更されません。 –

+0

新しいプロジェクトを作成し、大きなフレームのラベルを追加しました。次に、「プレースホルダ」を設定し、幅と高さのチェックボックスで「なし」を選択しました。何も起こらず、ラベルの内容に合わせてラベルのサイズが変更されませんでした。私は何の制約も設定しなかった。 – Centurion

1

もしあなたがアンドロイドのwrap_contentに精通すれば、intrinsicContentSizeはwrap_contentと同じです。

0

コンテンツを含むすべてのビューは、その固有のコンテンツサイズを計算できます。固有のコンテンツサイズは、すべてのUIViewインスタンスのメソッドによって計算されます。このメソッドはCGSizeインスタンスを返します

関連する問題