当我 NSLog myBtn.constraints 时记录额外的约束
Extra constraints are logged when I NSLog myBtn.constraints
我在视图中有一个按钮。我在界面生成器中为我的按钮设置了图像。
我在界面生成器中添加到我的按钮的约束是:
对超级视图的 space 权 = 10
top space 到 superview = 10
bottom space to superview >= 10
离开 space 标签 >= 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>")
我知道顶部、左侧、右侧和底部的约束不应该在这里记录,因为它们是超级视图约束而不是按钮约束。
但在这里我没有为我的按钮添加任何宽度和高度约束(即使在代码中)。
为什么在控制台中记录约束高度和宽度?
如果视图具有基于其内容的自然宽度,则它 returns 该宽度为 intrinsicContentSize.width
。否则,它将 intrinsicContentSize.width
设置为 UIViewNoIntrinsicMetric
。
同样,如果它有一个自然高度,它 returns 宽度为 intrinsicContentSize.height
。否则,它将 intrinsicContentSize.height
设置为 UIViewNoIntrinsicMetric
。
按钮具有自然大小(宽度和高度),由其标题、字体、图像和其他细节决定。所以它的 intrinsicContentSize.width
和 intrinsicContentSize.height
都是有效尺寸,而不是 UIViewNoIntrinsicMetric
.
当 intrinsicContentSize.width != UIViewNoIntrinsicMetric
时,自动布局会在视图上安装 NSContentSizeLayoutConstraint
类型的特殊约束。同样,当 intrinsicContentSize.height != UIViewNoIntrinsicMetric
时,自动布局会在视图上安装一个 NSContentSizeLayoutConstraint
。
有关这些特殊约束的详细信息,请参阅 this answer。
如果 view.translatesAutoresizingMaskIntoConstraints
是 FALSE
那么 UIKit 可能会添加 NSContentSizeLayoutConstraint 到视图。在这种情况下,自动布局使用 -sizeThatFits:
或 intrinsicContentSize
来计算视图的大小。
如果您有一个视图正在从一个父视图移动到另一个父视图,请务必重置 view.translatesAutoresizingMaskIntoConstraints
。如果新的超级视图使用自动布局,请将 translatesAutoresizingMaskIntoConstraints
设置为 FALSE
。如果新的 superview 不使用自动布局,设置为 TRUE
。如果您未能重置 translatesAutoresizingMaskIntoConstraints
那么您可能会看到意外的帧动画。
我在视图中有一个按钮。我在界面生成器中为我的按钮设置了图像。 我在界面生成器中添加到我的按钮的约束是:
对超级视图的 space 权 = 10
top space 到 superview = 10
bottom space to superview >= 10
离开 space 标签 >= 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>")
我知道顶部、左侧、右侧和底部的约束不应该在这里记录,因为它们是超级视图约束而不是按钮约束。 但在这里我没有为我的按钮添加任何宽度和高度约束(即使在代码中)。
为什么在控制台中记录约束高度和宽度?
如果视图具有基于其内容的自然宽度,则它 returns 该宽度为 intrinsicContentSize.width
。否则,它将 intrinsicContentSize.width
设置为 UIViewNoIntrinsicMetric
。
同样,如果它有一个自然高度,它 returns 宽度为 intrinsicContentSize.height
。否则,它将 intrinsicContentSize.height
设置为 UIViewNoIntrinsicMetric
。
按钮具有自然大小(宽度和高度),由其标题、字体、图像和其他细节决定。所以它的 intrinsicContentSize.width
和 intrinsicContentSize.height
都是有效尺寸,而不是 UIViewNoIntrinsicMetric
.
当 intrinsicContentSize.width != UIViewNoIntrinsicMetric
时,自动布局会在视图上安装 NSContentSizeLayoutConstraint
类型的特殊约束。同样,当 intrinsicContentSize.height != UIViewNoIntrinsicMetric
时,自动布局会在视图上安装一个 NSContentSizeLayoutConstraint
。
有关这些特殊约束的详细信息,请参阅 this answer。
如果 view.translatesAutoresizingMaskIntoConstraints
是 FALSE
那么 UIKit 可能会添加 NSContentSizeLayoutConstraint 到视图。在这种情况下,自动布局使用 -sizeThatFits:
或 intrinsicContentSize
来计算视图的大小。
如果您有一个视图正在从一个父视图移动到另一个父视图,请务必重置 view.translatesAutoresizingMaskIntoConstraints
。如果新的超级视图使用自动布局,请将 translatesAutoresizingMaskIntoConstraints
设置为 FALSE
。如果新的 superview 不使用自动布局,设置为 TRUE
。如果您未能重置 translatesAutoresizingMaskIntoConstraints
那么您可能会看到意外的帧动画。