17

iOS で autolayout を使用して、流動的な幅のレイアウトを作成しようとしています。現在使用している制約の視覚的な形式は次のとおりです。

[self.scrollViewContainer addConstraints:[NSLayoutConstraint 
     constraintsWithVisualFormat:@"H:|-(>=32)-[viewToAdd(<=576)]-(>=32)-|" 
                         options:0 
                         metrics:nil  
                           views:NSDictionaryOfVariableBindings(viewToAdd)
]];

つまり、両側に最小 32 ピクセルの間隔が必要でviewToAdd、最大幅が 576 ピクセルになるようにします。viewToAddこれは、すべての制約を満たしながら、利用可能なスペースをすべて使い切りたいという点を除けば、うまく機能します。現在viewToAdd、固有のコンテンツサイズと同じくらい広く、必要に応じて間隔が大きくなる唯一のものが得られます。

viewToAddをできるだけ大きくするように指定する方法はありますか?

4

2 に答える 2

35

ビューのサイズを変更して残りの使用可能なスペースを埋めるには、ビューに追加の制約を指定する必要があります。現在、ビューの最小値と最大値を設定していますが、自動レイアウトにより完全なソリューションを提供するための具体的な制約は設定していません。幅の上限に加えて、1. ビューの幅を解決するための開始点として、優先度の低い幅を明示的に指定するか、または 2. 両側の間隔をもう少し大きくする必要があります。厳格な制約。

説明した内容に基づいて、システムが幅を解決できるように、ビューを制約して、どちらかの側のスーパービューへのより実質的なバインディングを与える必要があります。ビューのサイズ自体をコンテナーのサイズに基づいて設定したいので、間隔の制約を変更する必要があります (上記のオプション 2)。上記の例では、最小間隔のみを指定しているため、次の制約ソリューションのいずれかが 400pt スーパービューの自動レイアウト エンジンによって有効であると検出されます。

|-32pt-[20pt]-------348pt-| <-- autolayout will probably choose this one
|-100pt----[20pt]---280pt-|
|-50pt--[20pt-]-----330pt-|

これはおそらくあなたが望んでいるものではありません。さらに、ビューの幅は 0 から 576pt の間の任意の値にすることができますが、これもおそらくあなたが望んでいるものではありません。autolayout はユーザーが何を望んでいるのかを認識していないためintrinsicContentSize、ビューの を使用して具体的なサイズ制限を設定しているだけです。間隔として 32pt を選択したため、最初のステップは、間隔の制約にさらに実質的な指示を与えることです。つまり、ビューの幅が適切でない限り、ビューとスーパービューの端の間の間隔を 32pts にする必要があることをシステムに伝えます。 >576点。VFL 文字列で次のようにします。

"H:|-(>=32,==32@900)-[viewToAdd(<=576)]-(>=32,==32@900)-|"

viewToAdd最大幅は 576pts で、それ自体と 32pts のスーパービューの間にパディングが必要です。スーパービュー のサイズが、最大幅に 64pts の初期パディングを加えた値を超えて大きくなった場合、両側のパディングは順番に拡大する必要があります。拘束セットの解決を続行します。"viewToAdd

これにより、次の制約が 400 ポイントのスーパービューに対して正しくなります。

|-32pt--[336pt]--32pt-|

viewToAddビューが最大値を超えたときにスーパービューの中心に留まりたい場合は、 のパラメータにオプションNSLayoutFormatAlignAllCenterXを渡す必要があります。パディングに制約を設定していない場合、またはパディングの制約に 1000 未満の優先度 (「必須」の制約優先度レベル) を設定していない場合、スーパービューは 640 ポイントを超えて拡大できません。options[NSLayoutConstraint -constraintsWithVisualFormat:]>=32==32

于 2012-10-30T19:39:41.543 に答える
1

これが質問に正確に答えるかどうかはわかりませんが、ストーリーボードを使用している場合:たとえば、親ビューの左側と右側の両方に幅の制約と制約を追加できることがわかりました。次に、幅制約を「=」ではなく「<=」に変更し、距離制約 (先頭と末尾の両方) の優先順位を 750 に設定すると、距離制約を考慮して、ビューは最大幅まで最大になります。ビューが小さすぎる場合。

実施されている制約

于 2016-02-28T11:37:20.687 に答える