2014-10-08 25 views
1

我有一个简单视图(控制器)具有两个子视图:加入NSLayoutConstraint使得视图消失

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; 
    viewA.translatesAutoresizingMaskIntoConstraints = NO; 
    viewA.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:viewA]; 


    UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; 
    viewB.translatesAutoresizingMaskIntoConstraints = NO; 
    viewB.backgroundColor = [UIColor grayColor]; 
    [self.view addSubview:viewB]; 
} 

当然它们在这一点上(ⅰ只能看到viewB)重叠。所以我增加了一个约束,使viewB下面viewA,像这样:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:viewB 
                 attribute:NSLayoutAttributeTop 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:viewA 
                 attribute:NSLayoutAttributeBottom 
                multiplier:1.f 
                 constant:0]]; 

这使得两个视图消失。我究竟做错了什么?

谢谢!

回答

1

使用约束条件时,您应该尽可能使用约束条件(不设置框架),因此添加一个约束条件不足以定义您的位置和大小。我不确定为什么添加一个约束会否定您为视图设置的大小,但它似乎确实如此。你应该这样做,以充分描述意见,

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIView *viewA = [UIView new]; 
    viewA.translatesAutoresizingMaskIntoConstraints = NO; 
    viewA.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:viewA]; 


    UIView *viewB = [UIView new]; 
    viewB.translatesAutoresizingMaskIntoConstraints = NO; 
    viewB.backgroundColor = [UIColor grayColor]; 
    [self.view addSubview:viewB]; 
    NSDictionary *dict = NSDictionaryOfVariableBindings(viewA,viewB); 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[viewA(==50)]" options:0 metrics:nil views:dict]]; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[viewB(==50)]" options:0 metrics:nil views:dict]]; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[viewA(==50)][viewB(==50)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:dict]]; 
} 
+0

非常感谢! – 0xSina 2014-10-08 05:53:03