7

ルートビューコントローラー内で、次のように子ビューコントローラーのビューをサブビューとして追加しています。

ChildViewController *cvc = [[ChildViewController alloc] init];
[self addChildViewController:cvc];
[self.view addSubview:cvc.view];
[cvc didMoveToParentViewController:self];

そして、NSLayoutConstraintを使用して、cvc.viewを親ビュー(self.view)内に配置し、cvc.viewが親ビューの下部から25ポイント上に配置されるようにします。私の理解では、次のことが機能するはずです。

UIView *superview = self.view;
UIView *childview = cvc.view;
NSLayoutConstraint *cn = 
    [NSLayoutConstraint withItem:childview 
      attribute:NSLayoutAttributeBottom 
      relatedBy:NSLayoutRelationEqual 
      toItem:superview attribute:NSLayoutAttributeBottom 
      multiplier: 1.0 
      constant: -25.0];
[superview addConstraint: cn];

ただし、実行時に制約は失敗します。最初は、子ビューの自動サイズ変更マスクが問題を引き起こしている可能性があると思ったので(そして自動レイアウトに関するWWDC 2012イントロビデオに従って)、設定しましたが、子ビューが表示され[childview setTranslatesAutoresizingMaskIntoConstraints:NO]ません。

私は何が間違っているのですか?

4

2 に答える 2

3

よくわかりませんが、次のように機能するか、非常によく似ています。

UIView *superview = self.view;
UIView *childview = cvc.view;
NSDictionary *constrainedViews = NSDictionaryOfVariableBindings(childview);
NSArray *constraints =
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[childview]-25-|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews];

チャイルドビューのサイズを実際に設定していることを確認しない場合は、次のようになります。

UIView *superview = self.view;
UIView *childview = cvc.view;
NSDictionary *constrainedViews = NSDictionaryOfVariableBindings(childview);
NSArray *constraints =
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[childview]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews];

たとえば、ビューの幅を埋めるようにします。または:

UIView *superview = self.view;
UIView *childview = cvc.view;
NSDictionary *constrainedViews = NSDictionaryOfVariableBindings(childview);
NSArray *constraints =
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[childview(>100,<304)]-|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews];

つまり、childviewのようなものは、幅が100より大きく304未満で、スーパービューのデフォルトのマージンが必要です。上記の制約が実際に意味があるかどうかはわかりませんが(たとえば、デフォルトのマージンが残るため、常に304幅のチャイルドビューが表示される場合があります)、これは例として役立ちます。

于 2012-11-29T17:31:31.397 に答える
0

自動レイアウトを使用して子ViewControllerを適切にセットアップおよびサイズ設定するには、次の手順を実行します。

childView.translatesAutoresizingMaskIntoConstraints = NO;

NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:superview attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:childview attribute:NSLayoutAttributeLeft multiplier:1 constant:0];
[self.view addConstraint:left];
NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:superview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:childview attribute:NSLayoutAttributeTop multiplier:1 constant:0];
[self.view addConstraint:top];
NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:superview attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:childview attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
[self.view addConstraint:width];
NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:superview attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:childview attribute:NSLayoutAttributeHeight multiplier:1 constant:0];
[self.view addConstraint:height];

視覚的な形式が必要な場合は、次の操作を実行できます。

childView.translatesAutoresizingMaskIntoConstraints = NO;

NSDictionary *views = @{@"childview": childview};
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[childview]-0-|" options:0 metrics:nil views:views]];
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[childview]-0-|" options:0 metrics:nil views:views]];
于 2014-09-22T16:48:37.297 に答える