2012-11-02 10 views
7

間の制約を確立するために、iOSの自動レイアウトを使用して、私は、サブビューとして、子View Controllerのビューを追加している:私のルートビューコントローラ内の子ビューコントローラとその親ビュー

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

とI NSLayoutConstraintを使用して親ビュー(self.view)内でcvc.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]を設定しましたが、子ビューは表示されません。

私は間違っていますか?

答えて

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]; 

は、あなたが実際にchildviewのサイズを設定していることを確認していない場合は、何かのように:

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幅の子ビューを表示するなど)が、例として役立ちます。自動レイアウトと

0

正しくセットアップとサイズにあなたの子供のビューコントローラは、次の操作を行います

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]]; 

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]; 

あなたは次の操作を行うことができ、視覚的なフォーマットを希望する場合

関連する問題