AutoLayout适用于UIView,但不适用于UILabel。为什么?

时间:2013-03-18 21:59:22

标签: ios6 autolayout

所需方案:通过iOS6的AutoLayout vs Frames创建自定义警报视图:

1)在主机视图(UIController.view)上创建一个空的UIView:

alertView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 0, 0)];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[alertView(==300)]" options:0  metrics:nil views:viewsDict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[alertView]-|" options:0  metrics:nil views:viewsDict]];

这有效:我在主视图上看到了我的警报UIView(子视图)。


但是,尝试将UILabel添加到警报视图炸弹
看到UIView(1)被绘制出来,我只是代替了UILabel,看看我是否能得到一些东西:

- (UILabel *)createLabelWithMessage:(NSString *)message {
    if (!message) return nil;
    UILabel *myLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 0,0)];
    myLabel.text = message;
    [myLabel setFont:[UIFont systemFontOfSize:12.0]];
    [myLabel setAutoresizingMask:UIViewAutoresizingNone]; 
    myLabel.backgroundColor = [UIColor clearColor];
    return myLabel;
}
...
titleLabel = [self createLabelWithMessage:@"Danger"];
...
// ...replacing 'alertView' (UIView) with 'titleView' (UILabel):
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[titleLabel(==300)]" options:0  metrics:nil views:viewsDict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[titleLabel]-|" options:0  metrics:nil views:viewsDict]];

问题:为什么UILabel炸弹但UIView看起来还不错?

以下是Xcode的提示:

  

AutoLayoutContraints [3828:11303]无法同时满足   限制。
  
  可能至少有一个限制因素   以下列表是您不想要的。试试这个:   

  (1)看看每一个   约束并试图找出你不期望的东西;   

  (2)找到   添加了不需要的约束或约束并修复它的代码。   
  (注意:如果您正在看到NSAutoresizingMaskLayoutConstraints,那么   不明白,请参阅UIView属性的文档   translatesAutoresizingMaskIntoConstraints)(       “”       “”       “”)

     

将尝试通过违反约束来恢复      (姓名:'|':UIView:0x128727a0)>

UILabel中必须有一个隐藏的属性,它正在搞砸我的“视觉格式化”语言。

..我创建了另一个“alertView”子视图;我得到了同样的错误。显然,当我只在UIController的视图(subview)上显示一(1)个UIView('alertView')时,我只得到一个'好'的结果;仅此而已。


隐藏的东西与简单约束相冲突。我不知道是什么。

BTW:我使用NIB作为主机UIView,使用'use autoLayout''ON'。      但是,我将在没有'autolayout'(iOS 4.3+)的更大代码中使用它      iOS6检查程序。

1 个答案:

答案 0 :(得分:1)

解决方案:(根据我的评论)我错过了为特定子视图设置'setTranslatesAutoresizingMaskIntoConstraints'标志为'NO';虽然我已经为它的超级容器做了它。
示例:
[testView setTranslatesAutoresizingMaskIntoConstraints:NO];

不要忘记为所有成员UIViews使用'setTranslatesAutoresizingMaskIntoConstraints'