2

私がやろうとしていることは十分に単純に思えますが、私が期待している方法で物事をレイアウトすることはできません. さまざまな画面サイズを考慮して、フレームのハードコーディングを避けるために AutoLayout を使用しています。AutoLayout はすべての .xibs に対してオンになっていますが、Interface Builder 内で明示的な制約を作成していません。

ViewControllerA は ViewControllerB を埋め込み、VCB のビューをそのビュー階層に追加しています。VCA には TableView があり、VCB には UserView (サブビューを含む通常のビュー) があります。

TableView を UserView の上に配置したい。UserView の高さは固定されており、その下部は常に画面の下部に固定されたままになります。TableView は画面の残りの部分を埋めます。

これが私がコードに持っているものです。これにより、UserView が下に正常に貼り付けられます。

userViewController.view.translatesAutoresizingMaskIntoConstraints = false;
NSDictionary *constrainedViews = @{ @"userView" : userViewController.view, @"menu" : self.menuTable };
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[userView]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[userView(174)]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews]];

1) 制約を追加する前に呼び出さないとtranslatesAutoresizingMaskIntoConstraints、「制約を同時に満たすことができません」というメッセージが表示されます。私のコンソールでは、競合する NSAutoresizingMaskLayoutConstraints について不平を言っています。なんで?AutoLayout をオンにしています。このエラーは、AutoLayout ビューと非 AutoLayout ビューを組み合わせているときにのみ発生すると考えていました。IB で明示的な制約を設定していないためですか?

そのため、必要に応じて UserView を下に揃えました。次に、TableView スタックを一番上に作成し、残りの画面を埋めたいと思います。上記の最後の制約 (垂直制約) を次のように置き換えます。

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[menu][userView(174)]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews]];

コンソールに再び大量のエラーが表示されます。

(
"<NSLayoutConstraint:0xd39c880 'IB auto generated at build time for view with fixed frame' V:|-(0)-[UITableView:0xe914e00]   (Names: '|':UIView:0xd39ea60 )>",
"<NSLayoutConstraint:0xd39c590 'IB auto generated at build time for view with fixed frame' V:[UITableView:0xe914e00(362)]>",
"<NSLayoutConstraint:0xd3a4f60 V:[UITableView:0xe914e00]-(0)-[UIView:0xd39ff60]>",
"<NSLayoutConstraint:0xd3a4350 V:[UIView:0xd39ff60]-(0)-|   (Names: '|':UIView:0xd39ea60 )>",
"<NSAutoresizingMaskLayoutConstraint:0xd3af6d0 h=-&- v=-&- UIView:0xd39ff60.midY == UIView:0xd39ea60.midY>"
)

何時間も立ち往生しており、どうすればよいかわかりません。私が間違っていることはありますか?IB auto が固定フレームを生成し、新しい制約でオーバーライドできないのはなぜですか?

4

1 に答える 1

7

壊れた制約は、UITableView 自体ではなく、スーパービュー、または UITableView を含むビューにあるようです。これらの制約をコードで設定する予定がある場合は、最初にこれらの自動制約をすべて削除する必要があります。

[self.view removeConstraints:self.view.constraints];
于 2013-10-21T14:31:47.257 に答える