iOS Autolayout相对于兄弟UIViews编程方式

问题描述:

我想在容器视图(C1)内添加3个自定义视图(redView,greenView,yellowView),使得所有自定义视图(redView,greenView,yellowView)都低于彼此以编程方式使用自动布局约束。我希望容器视图(C1)获得与子视图大小相同的大小,所以输出应该是这样的。 enter image description hereiOS Autolayout相对于兄弟UIViews编程方式

红色,绿色和黄色的意见只是为了显示预期的结果。其实我的习惯观是这样的。

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

你给了一些错误的约束,我已经纠正了它试试这个...

- (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

仍然无法正常工作。我知道你纠正了我对第二和第三种观点的最高限制,但我不小心把这两个项目都放在了底部。本来我正确地做到了这一点。 – Madu