0

我刚刚在界面构建器(基本的单视图应用程序)上将 UIView 作为子视图添加到主 UIView。如果不设置任何约束,我的子视图就会消失。

subview's frame = (0 0; 320 0);

这是为什么?

如果我尝试添加一些约束,例如要固定的尾随空格、前导空格、顶部空间和底部空间,我的视图仍然会消失。

我该如何解决这个问题?

谢谢你。

只是为了澄清一点,我创建了一个测试项目(单视图应用程序),并在主视图中添加了 2 个子视图,如图所示。我没有更改任何默认约束。您可以在图像的日志中看到错误。 测试项目

日志:

**2013-01-19 17:16:02.435 Test[8871:c07] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x106178c0 h=--- v=--- V:[UIWindow:0x9917040(480)]>",
    "<NSLayoutConstraint:0x106159e0 UIView:0x991a5a0.bottom == UIWindow:0x9917040.bottom>",
    "<NSLayoutConstraint:0x991ab00 V:|-(518)-[BottomView:0x9919c90]   (Names: '|':UIView:0x991a5a0 )>",
    "<NSLayoutConstraint:0x10615960 V:|-(20)-[UIView:0x991a5a0]   (Names: '|':UIWindow:0x9917040 )>",
    "<NSLayoutConstraint:0x991aa80 BottomView:0x9919c90.bottom == UIView:0x991a5a0.bottom>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x991aa80 BottomView:0x9919c90.bottom == UIView:0x991a5a0.bottom>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.**

约束: 在此处输入图像描述

这也是模拟器上的结果: 在此处输入图像描述

4

1 回答 1

0

了解这些日志是一种很好的做法,但如果您要使用 Autolayout,则必须阅读此内容。每个人都说它很简单,但我个人认为它并不简单。

Apples AutoLayout 编程指南

请阅读本指南,尤其是调试部分。

作为一个非常非常普遍的规则,如果你要添加一个视图,那么你需要关闭视图的 autoresizingmasks(Spring 和 struts)。将视图添加为子视图并为其提供 2 或 3 个约束。在你上面的例子中,你会给它一个约束,它应该有一个左边或前导空间到超级视图 0。一个顶部空间到超级视图 0 和宽度 320。

编辑; 这是添加视图的示例;请注意,您不需要创建框架。约束可能有点奇怪。第一个将视图放在超级视图的中心。第二个给它一个 200 的宽度。下一个方法是垂直约束,它将视图放在底部并使其高 2。

    UIView *sView = [[UIView alloc] init];
[sView setTranslatesAutoresizingMaskIntoConstraints:NO];
[superView addSubview:sView];

[superView addConstraint:[NSLayoutConstraint constraintWithItem:sView
                                                 attribute:NSLayoutAttributeCenterX
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:superView
                                                 attribute:NSLayoutAttributeCenterX
                                                multiplier:1.0
                                                  constant:0]];

[superView addConstraint:[NSLayoutConstraint constraintWithItem:sView
                                                             attribute:NSLayoutAttributeWidth
                                                             relatedBy:NSLayoutRelationEqual
                                                                toItem:Nil
                                                             attribute:NSLayoutAttributeWidth
                                                            multiplier:1.0
                                                              constant:200]];

[superView addConstraints:[NSLayoutConstraint
                                  constraintsWithVisualFormat:@"V:[sView(2)]|"
                                  options:0
                                  metrics:nil
                                  views:NSDictionaryOfVariableBindings(sView)]];
于 2013-01-21T11:06:05.707 回答