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 以编程方式生成的视图具有隐藏的约束,导致与自动布局发生冲突的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加具有约束的多个子视图会引发异常

在界面生成器中隐藏视图控制器的标签栏

iOS:具有隐藏视图的布局约束

以编程方式向 Swift 中的视图添加约束时出错

iOS - 以编程方式在具有自动布局的 UITextField 内定位 UIImageView

通过 constraintSet 以编程方式设置约束会导致视图消失