私がやろうとしていることは十分に単純に思えますが、私が期待している方法で物事をレイアウトすることはできません. さまざまな画面サイズを考慮して、フレームのハードコーディングを避けるために 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 が固定フレームを生成し、新しい制約でオーバーライドできないのはなぜですか?