当我NSLog myBtn.constraints时会记录额外的约束

时间:2016-04-17 07:37:40

标签: ios ios-autolayout

我在视图中有一个按钮。我在界面构建器中为我的按钮设置了图像。 我在界面构建器中添加到按钮的约束是:

superview的正确空间= 10

topview = superview = 10

超级视图的底部空间> = 10

将空格留给标签> = 10

一切正常,我的布局没问题。 但是当我用这段代码记录按钮约束时:

NSLog(@"constraints for btnBack is: %@", self.btnBack.constraints);

控制台记录:

constraints for btnBack is:(

"<NSContentSizeLayoutConstraint:0x7c35c400 H:[UIButton:0x7c3588a0(102)] Hug:250 CompressionResistance:750>"

"<NSContentSizeLayoutConstraint:0x7c35c450 V:[UIButton:0x7c3588a0(92)] Hug:250 CompressionResistance:750>")

我知道top和left和right和bottom约束不应该在这里记录,因为它们是superview约束而不是按钮约束。 但在这里,我没有为我的按钮添加任何宽度和高度约束(即使在代码中)。

为什么在控制台中记录约束高度和宽度?

2 个答案:

答案 0 :(得分:8)

如果视图具有基于其内容的自然宽度,则会将该宽度返回为intrinsicContentSize.width。否则,它会将intrinsicContentSize.width设置为UIViewNoIntrinsicMetric

同样,如果它具有自然高度,则将该宽度返回为intrinsicContentSize.height。否则,它会将intrinsicContentSize.height设置为UIViewNoIntrinsicMetric

按钮具有自然尺寸(宽度和高度),由其标题,字体,图像和其他细节决定。因此,intrinsicContentSize.widthintrinsicContentSize.height都是有效尺寸,而不是UIViewNoIntrinsicMetric

intrinsicContentSize.width != UIViewNoIntrinsicMetric时,自动布局会在视图上安装类型为NSContentSizeLayoutConstraint的特殊约束。同样,当intrinsicContentSize.height != UIViewNoIntrinsicMetric时,自动布局会在视图上安装NSContentSizeLayoutConstraint

有关这些特殊约束的详细信息,请参阅this answer

答案 1 :(得分:0)

如果 view.translatesAutoresizingMaskIntoConstraintsFALSE,则 UIKit 可能会将 NSContentSizeLayoutConstraint 添加到视图中。在这种情况下,自动布局使用 -sizeThatFits:intrinsicContentSize 来计算视图的大小。

如果您有一个视图要从一个超级视图移动到另一个超级视图,请务必重置 view.translatesAutoresizingMaskIntoConstraints。如果新的超级视图使用自动布局,请将 translatesAutoresizingMaskIntoConstraints 设置为 FALSE。如果新的超级视图不使用自动布局,则设置为 TRUE。如果您未能重置 translatesAutoresizingMaskIntoConstraints,那么您可能会看到意外的帧动画。