我有一个视图,以编程方式创建子视图并为其添加一些约束。出于某种原因,约束被完全忽略。不会抛出任何错误。约束根本不起作用。子视图与超级视图具有相同的框架。我期待它是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];
没有成功。
答案 0 :(得分:9)
您需要告诉视图不要使用基于自动调整大小的布局,而是使用autolayout
instructionsView.translatesAutoresizingMaskIntoConstraints = NO;
此外,视图应该在没有框架的情况下创建,这主要是一种风格的东西,但创建你的视图是这样的:
instructionsView = [[UIView alloc] init];
答案 1 :(得分:2)
歧义可能会导致令人惊讶的结果,而不会引发任何异常。要调试歧义约束,请在调试器中暂停并在lldb命令行中键入:
po [[UIWindow keyWindow] _autolayoutTrace]
此外,您可以(并且应该)在UIView上添加一个方法(通过类别),允许您以递归方式向下调用hasAmbiguousLayout
。
最后,您可以(并且应该)在UIView上添加一个方法(通过类别),允许您在层次结构中递归调用constraintsAffectingLayoutForOrientation:
。
通过这种方式,您可以追踪到底发生了什么。