[英]Subview constraints programmatically
我想以编程方式对电子邮件字段进行约束。 但是它不起作用。
图像描述:有一个TopView。 在此,白色框是TopInnerView
。 最后,如果我添加EmailTextField
在TopInnerView
。 显示错误。
这是我的代码:
//MainView
MainView = [[UIView alloc]initWithFrame:CGRectMake(0, 0,self.view.frame.size.width, self.view.frame.size.height)];
MainView.backgroundColor = [UIColor whiteColor];
[MainView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:MainView];
//TopView
TopView = [[UIView alloc]init];
TopView.backgroundColor = [UIColor groupTableViewBackgroundColor];
[MainView addSubview:TopView];
[TopView setTranslatesAutoresizingMaskIntoConstraints:NO];
//TopInnerView
TopInnerView = [[UIView alloc]init];
TopInnerView.backgroundColor = [UIColor redColor];
[TopView addSubview:TopInnerView];
[TopInnerView setTranslatesAutoresizingMaskIntoConstraints:NO];
//EmailTextField
EmailTextField = [[UITextField alloc]init];
//WithFrame:CGRectMake(10, 0, 270, 40)];
EmailTextField.borderStyle = UITextBorderStyleRoundedRect;
[TopInnerView addSubview:EmailTextField];
id views = @{
@"TopView": TopView,
@"TopInnerView": TopInnerView,
@"CenterView":CenterView,
@"BottomView": BottomView,
@"EmailTextField":EmailTextField
};
// TopView constraints
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[TopView(320)]" options:0 metrics:nil views:views]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:TopView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:TopView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:110]];
//[self.view addConstraint:[NSLayoutConstraint constraintWithItem:TopView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
NSLayoutConstraint *TopViewHeightConstraint = [NSLayoutConstraint constraintWithItem:TopView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:170.0];
[self.view addConstraint:TopViewHeightConstraint];
// TopInnerView constraints
[TopView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[TopInnerView]-20-|" options:0 metrics:nil views:views]];
[TopView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[TopInnerView(80)]" options:0 metrics:nil views:views]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:TopInnerView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:TopView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]];
[TopView addConstraint:[NSLayoutConstraint constraintWithItem:TopInnerView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:TopView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];
//[TopView addConstraint:[NSLayoutConstraint constraintWithItem:TopInnerView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:TopView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
//EmailTextField Constriants
//[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[EmailTextField(270)]" options:0 metrics:nil views:views]];
//Leading Constriant
NSLayoutConstraint *Leading = [NSLayoutConstraint
constraintWithItem:EmailTextField
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:10.0];
//Trailing Constriant
NSLayoutConstraint *Trailing = [NSLayoutConstraint
constraintWithItem:EmailTextField
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:0.0];
[self.view addConstraint:Leading];
[self.view addConstraint:Trailing];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:EmailTextField attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:TopInnerView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]];
NSLayoutConstraint *EmailTextFieldHeightConstraint = [NSLayoutConstraint constraintWithItem:EmailTextField attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:40.0];
[self.view addConstraint:EmailTextFieldHeightConstraint];
可以肯定的是,程序约束可能是一件微妙的事情,它们会使您发疯。 话虽这么说,但我看到这里发生的一些事情会使我感到紧张,如果这是我的设计。
首先,您要创建每个视图,并将每个视图作为子视图添加到刚创建的视图中(这不一定是错误的)。 然后,你到它相应的亲本视图-除了与有关每个视图约束EmailTextField
你在哪里与前两个约束self.view
。
接下来,您的Leading
约束将使用NSLayoutAttributeTrailing
属性; 我NSLayoutAttributeLeading
这是一个错字,应该是NSLayoutAttributeLeading
。 没有看到您的错误,我不能确定,但是我EmailTextView
,您需要将EmailTextView
前两个关系更改为如下所示:
//EmailTextView
[TopInnerView addSubview:EmailTextField];
NSLayoutConstraint *Leading = [NSLayoutConstraint
constraintWithItem:EmailTextField
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:TopInnerView
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:10.0];
//Trailing Constraint
NSLayoutConstraint *Trailing = [NSLayoutConstraint
constraintWithItem:EmailTextField
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:TopInnerView
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:0.0];
然后将这两个都作为约束添加到self.view
,考虑到如何定义这些约束,这将是一致的。 但是,你终于定义之间的两个约束EmailTextField
和InnerTopView
和添加这些约束self.view
这是不符合你如何做之前保持一致。 使用您现有的设计,我会尝试这样做:
[TopInnerView addConstraint:Leading];
[TopInnerView addConstraint:Trailing];
您的最后两个约束可以从接受相同的一致性处理中受益; 我将把它留给您作为练习。
总的来说,我敢打赌,UI可能只是在所有嵌入式约束上都令人窒息。 如果这些调整无济于事,我建议您将代码返回到第一次定义EmailTextField
对象的位置。 然后一个接一个地处理每个约束,以确保您一致地定义每个约束。 最后,将每个对象一次添加到UI层次结构中,以确保您在该方法中也保持一致。 最终,您将找到导致问题的约束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.