约束代码应该写在哪里?

时间:2014-03-09 00:25:26

标签: ios autolayout

我在awakeFromNib中编写了以下代码。

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CalendarMonthBackground"]];
[self addSubview:imageView];

[imageView addConstraint:[NSLayoutConstraint constraintWithItem:imageView
                                                      attribute:NSLayoutAttributeWidth
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:nil
                                                      attribute:NSLayoutAttributeNotAnAttribute
                                                     multiplier:1.0f
                                                       constant:159.0f]]; // 318 / 2

[imageView addConstraint:[NSLayoutConstraint constraintWithItem:imageView
                                                      attribute:NSLayoutAttributeHeight
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:nil
                                                      attribute:NSLayoutAttributeNotAnAttribute
                                                     multiplier:1.0f
                                                       constant:122.5f]]; // 245 / 2

[self addConstraint:[NSLayoutConstraint constraintWithItem:imageView
                                                 attribute:NSLayoutAttributeCenterX
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:self                                                     
                                                 attribute:NSLayoutAttributeCenterX
                                                multiplier:1.0f
                                                  constant:0.0]];

[self addConstraint:[NSLayoutConstraint constraintWithItem:imageView
                                                 attribute:NSLayoutAttributeTop
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:self
                                                 attribute:NSLayoutAttributeTop
                                                multiplier:1.0f
                                                  constant:-5.0f]];

约束未按设计显示。

我是否将约束代码设置在错误的位置?

我看到很多样本将约束放在控制器中,但我想把它放在视图中。

1 个答案:

答案 0 :(得分:1)

更新UIView子类的约束的通常位置(鉴于名称,这并不是非常令人惊讶)是......等待它...... updateConstraints

如果您只需要执行一次,那么请使用BOOL实例变量来确保。

但是,将代码放在那里并不能保证约束本身是好的。 “约束没有按设计显示”可能意味着什么,所以很难用任何精度来帮助你。但请记住,您可以犯两种错误 - 您可以创建冲突的约束,或者您可以创建不充分(模糊)约束。在后一种情况下,您不会从运行时获得任何警告;通常情况下,这表明您的观点根本没有出现。

您的代码实际上错误是您忘了说:

 imageView.translatesAutoresizingMaskIntoConstraints = NO;

但是你看,你做了一个错误的假设(我在错误的地方设置我的约束),所以你问了错误的问题,所以你自然会得到错误的答案。不仅如此 - Xcode向您显示警告,向您解释(在控制台中):您 创建冲突的约束。但你忽略了这个警告,即使它告诉你答案。