为什么我以编程方式创建的视图会忽略其约束?

时间:2014-02-10 20:56:20

标签: ios objective-c autolayout

我有一个视图,以编程方式创建子视图并为其添加一些约束。出于某种原因,约束被完全忽略。不会抛出任何错误。约束根本不起作用。子视图与超级视图具有相同的框架。我期待它是400x400并以其超级视图为中心。我在这做错了什么?这是我在superview中的initWithFrame:

- (id) initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        instructionsView = [[UIView alloc] initWithFrame:frame];
        [self addSubview:instructionsView];
        [self bringSubviewToFront:instructionsView];

        [self addConstraint:[NSLayoutConstraint constraintWithItem:instructionsView
                                                         attribute:NSLayoutAttributeCenterX
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self
                                                         attribute:NSLayoutAttributeCenterX
                                                        multiplier:1.
                                                          constant:0]];

        [self addConstraint:[NSLayoutConstraint constraintWithItem:instructionsView
                                                         attribute:NSLayoutAttributeCenterY
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self
                                                         attribute:NSLayoutAttributeCenterY
                                                        multiplier:1.
                                                          constant:0]];

        [instructionsView addConstraint:[NSLayoutConstraint constraintWithItem:instructionsView
                                                                     attribute:NSLayoutAttributeWidth
                                                                     relatedBy:NSLayoutRelationEqual
                                                                        toItem:nil
                                                                     attribute:NSLayoutAttributeNotAnAttribute
                                                                    multiplier:1.
                                                                      constant:400]];

        [instructionsView addConstraint:[NSLayoutConstraint constraintWithItem:instructionsView
                                                                     attribute:NSLayoutAttributeHeight
                                                                     relatedBy:NSLayoutRelationEqual
                                                                        toItem:nil
                                                                     attribute:NSLayoutAttributeNotAnAttribute
                                                                    multiplier:1.
                                                                      constant:400]];
    }
    return self;
}

我尝试过更改

instructionsView = [[UIView alloc] initWithFrame:frame];

instructionsView = [[UIView alloc] initWithFrame:CGRectZero];

没有成功。

2 个答案:

答案 0 :(得分:9)

您需要告诉视图不要使用基于自动调整大小的布局,而是使用autolayout

instructionsView.translatesAutoresizingMaskIntoConstraints = NO;

请参阅documentation here

此外,视图应该在没有框架的情况下创建,这主要是一种风格的东西,但创建你的视图是这样的:

instructionsView = [[UIView alloc] init];

答案 1 :(得分:2)

歧义可能会导致令人惊讶的结果,而不会引发任何异常。要调试歧义约束,请在调试器中暂停并在lldb命令行中键入:

po [[UIWindow keyWindow] _autolayoutTrace]

此外,您可以(并且应该)在UIView上添加一个方法(通过类别),允许您以递归方式向下调用hasAmbiguousLayout

最后,您可以(并且应该)在UIView上添加一个方法(通过类别),允许您在层次结构中递归调用constraintsAffectingLayoutForOrientation:

通过这种方式,您可以追踪到底发生了什么。