2

このように積み重ねられた一連のビューがあります

 ________________
|                |
|     View 1     |
|________________|
|                |
|     View 2     |
|________________|
|                |
|     View 3     |
|________________|

これらのビューは展開および折りたたむことができるため、ビュー 1 が展開されている場合、ビュー 2 はビュー 1 の上部と下部を持ち、ビュー 2 に関連するビュー 3 についても同じです。

 ________________
|                |
|     View 1     |
|                |
|                |
|                |
|________________|
|                |
|     View 2     |
|________________|
|                |
|     View 3     |
|________________|

 ________________
|                |
|     View 1     |
|________________|
|                |
|     View 2     |
|                |
|                |
|                |
|________________|
|                |
|     View 3     |
|________________|

このレイアウトは動的に作成されるため、IB を介してこれらのビューを追加することはできません。そのため、コードと制約を介してビューを追加する必要があります。

私はこれをやっています

UIView *previousView = nil;
for (UIView *view in views) {

    if (previousView) {

        NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[previousView][view]"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:NSDictionaryOfVariableBindings(previousView, view)];

        [superview addConstraints:constraints];
    }
}

ビューをタップして展開すると、エラーが発生します

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x76407b0 h=&-& v=--& V:[MyView:0x764c0f0(44)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x763e370 h=&-& v=--& V:[MyView:0x7646490(44)]>",
    "<NSLayoutConstraint:0x76440d0 V:[MyView:0x764c0f0]-(0)-[MyView:0x7648eb0]>",
    "<NSLayoutConstraint:0x7643920 V:[MyView:0x7648eb0]-(0)-[MyView:0x7646490]>",
    "<NSAutoresizingMaskLayoutConstraint:0x76407f0 h=&-& v=--& MyView:0x764c0f0.midY == + 22>",
    "<NSAutoresizingMaskLayoutConstraint:0x76d9ea0 h=&-& v=--& MyView:0x7648eb0.midY == + 91.5>",
    "<NSAutoresizingMaskLayoutConstraint:0x763e3b0 h=&-& v=--& MyView:0x7646490.midY == + 110>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7643920 V:[MyView:0x7648eb0]-(0)-[MyView:0x7646490]>

明らかに、私はこれを間違っています。配置に独自の制約を設定setTranslatesAutoresizingMaskIntoConstraintsNOて追加する必要がありますか? または問題は、そのループに追加している制約ですか?

4

2 に答える 2

2

ビューのサイズをどのように変更していますか?2 つのビュー間の垂直方向のスペースを 0 に固定する制約があります。表示されるエラーは、他の制約 (おそらく明示的に追加していない制約) を示していますか? ビュー 2 および/またはビュー 3 には、制約を満たすために下に移動することを許可していない別の制約があると思われV-[View 1]-(0)-[View 2]ます。

他の制約が関係していない場合は、展開または折りたたむビューの高さを変更するだけで機能します。

Apple のドキュメントに記載されているように、すべての制約を自分で設定する場合は、おそらく呼び出す必要があります。setTranslatesAutoresizingMaskIntoConstraints:NOそうしないと、明示的な制約が暗黙的に追加された Autoresizing Mask 制約と競合し、この場合のようになります。

編集:すべての制約をリストした上記の編集を見て、私が言っていることを確認します。自動サイズ変更マスクの変換によって追加される制約が、自動レイアウト制約と矛盾しています。それらは、スーパービューに関連して各ビューの中心 Y 位置を明示的に固定しています。setTranslatesAutoresizingMaskIntoConstraints:NO必要に応じて、必要なその他の制約を設定してみてください。

于 2013-06-24T09:42:05.807 に答える