我在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]];
约束未按设计显示。
我是否将约束代码设置在错误的位置?
我看到很多样本将约束放在控制器中,但我想把它放在视图中。
答案 0 :(得分:1)
更新UIView子类的约束的通常位置(鉴于名称,这并不是非常令人惊讶)是......等待它...... updateConstraints
!
如果您只需要执行一次,那么请使用BOOL实例变量来确保。
但是,将代码放在那里并不能保证约束本身是好的。 “约束没有按设计显示”可能意味着什么,所以很难用任何精度来帮助你。但请记住,您可以犯两种错误 - 您可以创建冲突的约束,或者您可以创建不充分(模糊)约束。在后一种情况下,您不会从运行时获得任何警告;通常情况下,这表明您的观点根本没有出现。
您的代码实际上错误是您忘了说:
imageView.translatesAutoresizingMaskIntoConstraints = NO;
但是你看,你做了一个错误的假设(我在错误的地方设置我的约束),所以你问了错误的问题,所以你自然会得到错误的答案。不仅如此 - Xcode向您显示警告,向您解释(在控制台中):您 创建冲突的约束。但你忽略了这个警告,即使它告诉你答案。