所需方案:通过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检查程序。
答案 0 :(得分:1)
解决方案:(根据我的评论)我错过了为特定子视图设置'setTranslatesAutoresizingMaskIntoConstraints'标志为'NO';虽然我已经为它的超级容器做了它。
示例:强>
[testView setTranslatesAutoresizingMaskIntoConstraints:NO];
不要忘记为所有成员UIViews使用'setTranslatesAutoresizingMaskIntoConstraints'!