1

所需场景:通过 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 的视图(子视图)上显示一(1)个 UIView(“alertView”)时,我只会得到一个“好”的结果;而已。


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

顺便说一句:我使用 NIB 作为主机 UIView,并使用“使用 autoLayout”“ON”。但是,我将在没有“自动布局”(iOS 4.3+)的较大代码中使用它,在 iOS6 检查例程中。

4

1 回答 1

1

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

不要忘记所有成员 UIView使用“setTranslatesAutoresizingMaskIntoConstraints” !

于 2013-03-18T22:53:48.300 回答