iOS 以编程方式生成的视图具有隐藏的约束,导致与自动布局发生冲突
Posted
技术标签:
【中文标题】iOS 以编程方式生成的视图具有隐藏的约束,导致与自动布局发生冲突【英文标题】:iOS programmatically generated view has hidden constraints causing conflicts with auto layout 【发布时间】:2013-12-23 03:18:18 【问题描述】:这是一个链接到视图控制器的非常基本的视图。该视图有一个带有编码约束的 UILabel。代码实际上运行正常,但是控制台注册了一个约束冲突,我不知道是代码的哪一部分造成了冲突。
LocationView.m 文件
#import "LocationView.h"
@implementation LocationView
@synthesize locationTitle;
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
// Initialization code
[self setBackgroundColor: [UIColor blueColor]];
locationTitle = [[UILabel alloc]init];
[locationTitle setTranslatesAutoresizingMaskIntoConstraints:NO];
locationTitle.backgroundColor = [UIColor whiteColor];
[self addSubview:locationTitle];
NSDictionary *viewLocationTitle = NSDictionaryOfVariableBindings(locationTitle);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[locationTitle]|"
options:0
metrics:0
views:viewLocationTitle]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[locationTitle(50)]|"
options:0
metrics:0
views:viewLocationTitle]];
- (void)updateConstraints
[super updateConstraints];
@end
控制台错误
Unable to simultaneously satisfy constraints.
(
"<NSLayoutConstraint:0x109510990 V:|-(NSSpace(20))-[UILabel:0x10950b660] (Names: '|':LocationView:0x10950acc0 )>",
"<NSLayoutConstraint:0x109510c10 V:[UILabel:0x10950b660(50)]>",
"<NSLayoutConstraint:0x109510c60 V:[UILabel:0x10950b660]-(0)-| (Names: '|':LocationView:0x10950acc0 )>",
"<NSAutoresizingMaskLayoutConstraint:0x108f3ae00 h=--& v=--& V:[LocationView:0x10950acc0(568)]>"
)
【问题讨论】:
【参考方案1】:我认为您是在说您希望它高 50 点并固定在超级视图的顶部和底部(您在标签之前和之后添加了 |)。
尝试将您的垂直约束更改为
@"V:|-[locationTitle(50)]"
或者您可以为其中一个约束添加较低的优先级,但我猜这就是您的意思。
【讨论】:
【参考方案2】:问题在于这个字符串“V:|-[locationTitle(50)]|”。 Tis 说 locationTitle 是距视图顶部的标准距离(我认为是 20 点),距底部 0 点,但它只有 50 点高——只有当超级视图高 70 点时才能满足。您可能想要移除顶部或底部约束(或者如果您想要将其拉伸到整个视图迷你 20 点顶部空间的高度)。
【讨论】:
以上是关于iOS 以编程方式生成的视图具有隐藏的约束,导致与自动布局发生冲突的主要内容,如果未能解决你的问题,请参考以下文章