2016-04-28 15 views
0

すべてのカスタムビュー(redView、greenView、yellowView)が互いに下になるように、コンテナビュー(C1)内に3つのカスタムビュー(redView、greenView、yellowView)自動的にレイアウト制約をプログラマチックに使用します。私はコンテナビュー(C1)がサブビューのサイズと同じサイズを取得したいので、出力はこのようにする必要があります。 enter image description hereiOS Autolayoutは兄弟UIViewとプログラム的に比較

赤、緑、黄色の表示は、予期した結果を示すことに過ぎません。実際に私が持っているカスタムビューはこのようなものです。

enter image description here

私はこれを行うには、自動レイアウトを使用しています。これは私のコードです。 RatingsSingleViewは上記の画像に示されている私のカスタムビューです。

@interface ViewController() 

    @property (weak, nonatomic) IBOutlet UIView *ratingsContainerView; 

    @end 

    @implementation ViewController 



     - (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    UIView *previousTopView = self.ratingsContainerView; 
    for(int i = 0; i < 3; ++i) { 
     RatingsSingleView *view = [[RatingsSingleView alloc] init]; 
     view.translatesAutoresizingMaskIntoConstraints = NO; 
     [self.ratingsContainerView addSubview:view]; 
     NSLayoutConstraint *topConstraint = nil; 
     if(i == 0) { 
      // Making the first subview top aligned to the container View top 
      topConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:previousTopView attribute:NSLayoutAttributeTop multiplier:1.0 constant:10.0]; 
     } else{ 
        // Making the second and third subview top aligned to the view above it 
      topConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:previousTopView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:10.0]; 
     } 

     NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.ratingsContainerView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:10.0]; 

     NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.ratingsContainerView attribute:NSLayoutAttributeRight multiplier:1.0 constant:10.0]; 


     [self.ratingsContainerView addConstraint:topConstraint]; 
     [self.ratingsContainerView addConstraint:leftConstraint]; 
     [self.ratingsContainerView addConstraint:rightConstraint]; 


     if(i == 2) { 
      // Adding last subview bottom to the container View bottom 
      NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.ratingsContainerView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-10.0]; 
      [self.ratingsContainerView addConstraint:bottomConstraint]; 

     } 
     previousTopView = view; 

    } 
} 
@end 

したがって、問題は期待した結果が得られません。コンテナビューを左右の端に固定し、ストーリーボードの高さを0に設定します。上記のコードを実行すると、次の結果が得られます。

enter image description here

いくつかの体は、私がここで間違ってやっているものを私を導く可能性ができます。おかげ

+0

はそう問題は何ですか? –

+0

これはVFLでもっと簡単に行うことができます – Lefteris

+0

私はVFLにはあまり親しまれていません。 – Madu

答えて

0

あなたは、いくつかの間違った制約を与えていると私はそれがこれを試して修正してきました...

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    UIView *previousTopView = self.ratingsContainerView; 
    for(int i = 0; i < 3; ++i) { 
     RatingsSingleView *view = [[RatingsSingleView alloc] init]; 
     view.translatesAutoresizingMaskIntoConstraints = NO; 
     [self.ratingsContainerView addSubview:view]; 
     NSLayoutConstraint *topConstraint = nil; 
     if(i == 0) { 
      // Making the first subview top aligned to the container View top 
      topConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:previousTopView attribute:NSLayoutAttributeTop multiplier:1.0 constant:10.0]; 
     } else{ 
       // Making the second and third subview top aligned to the view above it 
      topConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:previousTopView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:10.0]; 
     } 

     NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.ratingsContainerView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:10.0]; 

     NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:self.ratingsContainerView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:10.0]; 


     [self.ratingsContainerView addConstraint:topConstraint]; 
     [self.ratingsContainerView addConstraint:leftConstraint]; 
     [self.ratingsContainerView addConstraint:rightConstraint]; 

     if(i == 2) { 
      // Adding last subview bottom to the container View bottom 
      NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.ratingsContainerView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:10.0]; 
      [self.ratingsContainerView addConstraint:bottomConstraint]; 

     } 
     previousTopView = view; 

} 
+0

まだ動作していません。私はあなたが2番目と3番目のビューのために私の上限制約を修正したことを知っていますが、私は誤って両方の項目を底に置いています。もともと私はそれを正しくやっています。 – Madu