iOS编程生成的视图具有隐藏的约束,导致与自动布局冲突

时间:2013-12-23 03:18:19

标签: ios uiview uilabel autolayout nslayoutconstraint

这是一个链接到视图控制器的非常基本的视图。该视图具有单个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)]>"
)

2 个答案:

答案 0 :(得分:1)

问题是这个字符串,“V:| - [locationTitle(50)] |”。 Tis表示,locationTitle是距离视图顶部的标准距离(我认为20点),距离底部0点,但它只有50点高 - 只有在超级视图高70点时才能满足。您可能想要删除顶部或底部约束(如果要将其拉伸到20点顶部空间的整个视图上,则可以移除高度。)

答案 1 :(得分:1)

我想你是说你希望它高50分并固定在超级视图的顶部和底部(你在标签之前和之后都包括了)。

尝试将垂直约束更改为

@"V:|-[locationTitle(50)]"

或者您可以为其中一个约束添加较低的优先级,但我猜这就是您的意思。