1

親ビュー内に子ビュー コントローラーのビューをレイアウトしようとしています。子ビュー コントローラーのビュー (サブビュー) は、14 ピクセルの上部余白を除いて、親ビュー全体にまたがる必要があります。

これを達成するには次のコードで十分だと思われますが、サブビューの原点は正しい (0, 14) であることがわかりますが、その幅と高さは両方とも 0 です。

次のコードを使用して、子ビュー コントローラーを追加し、ビューの制約を設定しています。

[self.view addSubview:_infoController.view];
[self addChildViewController:_infoController];
[_infoController didMoveToParentViewController:self];

UIView *infoView = _infoController.view;
NSDictionary *viewsDict = NSDictionaryOfVariableBindings(infoView);
NSArray *heightConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-14-[infoView]|" options:0 metrics:nil views:viewsDict];
NSArray *widthConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[infoView]|" options:0 metrics:nil views:viewsDict];

NSMutableArray *constraints = [NSMutableArray array];
[constraints addObject:[heightConstraints objectAtIndex:0]];
[constraints addObject:[widthConstraints objectAtIndex:0]];

[infoView setTranslatesAutoresizingMaskIntoConstraints:NO];

[self.view addConstraints:constraints];
[self.view setNeedsUpdateConstraints];

これにより、原点 (0, 14) とサイズ (0, 0) のビューが得られます。

または、「translatesAutoresizingMaskIntoConstraints」プロパティを無効にしないと、ビューには有効な原点とサイズがありますが、制約の競合が発生し、14 ピクセルの上部マージンが破棄されます。示されている競合は次のとおりです。

"<NSLayoutConstraint:0xba6bad0 V:|-(14)-[UIView:0xba6aec0]   (Names: '|':UIView:0xa3b9200 )>",
"<NSAutoresizingMaskLayoutConstraint:0xb8b4db0 h=--& v=--& V:[UIView:0xba6aec0(480)]>",
"<NSAutoresizingMaskLayoutConstraint:0xb8b4180 h=--& v=--& UIView:0xba6aec0.midY == + 240>"


Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xba6bad0 V:|-(14)-[UIView:0xba6aec0]   (Names: '|':UIView:0xa3b9200 )>

何か案は?

4

2 に答える 2

4

constraintsWithVisualFormat:options:metrics:views:NSArray理由によりa を返します。その理由は、ビジュアル フォーマットは通常、複数の制約を定義するためです。

ただし、各ビジュアル形式の最初のものを除くすべての制約を破棄しています。各ビジュアル フォーマットの最初の制約をビューに追加するだけです。ほとんどの場合、完全なレイアウトを定義するのに十分な制約を指定していません。

コードは次のようになります

NSArray *heightConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-14-[infoView]|" options:0 metrics:nil views:viewsDict];
[self.view addConstraints:heightConstraints];
NSArray *widthConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[infoView]|" options:0 metrics:nil views:viewsDict];
[self.view addConstraints:widthConstraints];

constraints配列は必要ありません。

于 2013-09-05T09:07:44.073 に答える
2

代わりにこれを試してください:

[self.view addSubview:_infoController.view];
[self addChildViewController:_infoController];
[_infoController didMoveToParentViewController:self];

UIView *infoView = _infoController.view;
NSDictionary *viewsDict = NSDictionaryOfVariableBindings(infoView);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-14-[infoView]|" options:0 metrics:nil views:viewsDict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[infoView]|" options:0 metrics:nil views:viewsDict]];

[infoView setTranslatesAutoresizingMaskIntoConstraints:NO];
于 2013-09-05T09:19:06.243 に答える