Xcode 5では、AppleはiOS(6+)およびMAC OS X(v10.7 +)のアプリケーションインターフェイスを構築するための新しいシステムを導入しました。これは、廃止された「Springs&Struts」(S&S)に代わるものです。 インターフェイス要素のサイズと位置を決定するルール(制約)の設定に基づいて、ALはS&Sよりもはるかに多くの機能を提供します。 ただし、ALの弱さ(より複雑なことに加えて)は、要素の変数セットを使用しています。 ALシステム自体はオプション要素をまったくサポートしていませんが、この制限を回避する方法があります。
猫の繁殖カードを表示する必要がある場合、各カードには品種名、原産国、および簡単な説明があります。 カード用に新しいxibファイルを作成し、ルートビューに3つのラベルを追加し(lines = 0プロパティを設定することを忘れないでください)、必要な制約を設定します。
これらのカードのいくつかをScrollViewに追加します。
ここではオプションの要素はなく、すべてが本来のように見えますが、十分な情報がない場合はどうなりますか? たとえば、原産国がわからない、または説明がありませんか?
明らかに、欠落データのラベルサイズはゼロになり、上下のインデントは単純に形成されました。 この問題を解決するにはいくつかの方法があります。
方法1:データを入力するときにビューから
未使用のアイテムを
削除します。 インターフェース要素の削除とともに、それに関連するすべての制約も削除されます。 確かに、たとえば人々の原産国のラベルを単に削除した場合、名前と説明の間のインデントは決定されません。 したがって、各オプション要素が削除される場合には、最初に追加の制約を追加する必要があります。



データを入力するとき、空のラベルのメソッドを呼び出すだけで十分です
- (void)removeFromSuperview
カードは正しく形成されます:
このアプローチには2つの欠点があります。
- 多くの追加の制約を導入する必要があります(オプション要素の数が増えると、その数も増えます)
- ラベルは削除されるため、完成したカードは再利用できません。 データセットが一致するという保証はありません。 一見、これは取るに足らないように見えるかもしれません。なぜなら、いつでも新しいカードを作成できるからです。 ただし、ScrollViewではなく、「Object Pool」パターンを実装するCollectionViewでカードを表示する必要がある場合、カードは再利用可能でなければなりません。
これらの欠点を回避するには、カードの構造を修正する必要があります。
- 上下に、固定高さの2つのビューを追加します。これらは、エッジからのインデントを設定するのに役立ちます
- ビュー内の各ラベルを囲みます。
制約を追加します。
さらに、ブロック内のconstraint'ov(点線でマーク)の場合、優先度の値を750(高)に設定します。
現在、高さの制約を追加するだけです。
方法2:ブロックの高さをcontentで設定します 。 X、Y、Zの値を変更することにより、各ブロックの最大高さを制限できるため、コンテンツがない場合にカードを埋めるときは、ブロックの高さを0に設定し、コンテンツが可能な最大ブロック高さを明らかに超える値である場合は、
したがって、以前の方法のすべての欠点を回避しました。必要な制約の数はオプションの要素の数に比例して増加せず、カードを再利用できます。
結論:
再利用が不要で、オプション要素の数が少ない場合は、データを入力するときに制約を追加して不要な要素を削除することをお勧めします。 再利用が必要な場合、または多くのオプション要素が必要な場合、インターフェイスをブロックに分割し、空のブロックの高さを0に設定する価値があります。