NSLayoutConstraint layout Margin 从 iOS 7 到 iOS 8 的变化
Posted
技术标签:
【中文标题】NSLayoutConstraint layout Margin 从 iOS 7 到 iOS 8 的变化【英文标题】:NSLayoutConstraint layoutMargin changes from iOS7 to iOS8 【发布时间】:2014-12-09 14:27:13 【问题描述】:我正在尝试在带有约束的滚动视图中添加一个视图。 一切都很好,但我不知道为什么,我的上限之一就是没有做我想做的事。
我的白色方块应该在我的红色超级视图的顶部,我的超级视图在 UIScrollView 内。但是在 ios7 上,我的红色 superview 和白色方块之间存在 8 点的神奇差距……这不是我的故事板的内容。
以及我在代码中放入的内容。 Self 是一个 UIscrollview。
viewFromController.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview: viewFromController];
NSArray* constraint_2 = [NSLayoutConstraint constraintsWithVisualFormat: @"|[n(200)]|"
options: 0
metrics: nil
views: @ @"n" : viewFromController];
NSArray* constraint_3 = [NSLayoutConstraint constraintsWithVisualFormat: @"V:|[n(==l)]|"
options: 0
metrics: nil
views: @ @"n" : viewFromController, @"l" : self];
[self addConstraints: constraint_2];
[self addConstraints: constraint_3];
它适用于IOS8,但不适用于IOS7。
IOS8 >
constraint (
"<NSLayoutConstraint:0x7fa1507351d0 UIView:0x7fa150734a60.trailingMargin == UIView:0x7fa150734b30.trailing + 100>",
"<NSLayoutConstraint:0x7fa150735220 UIView:0x7fa150734b30.top == UIView:0x7fa150734a60.topMargin>",
"<_UILayoutSupportConstraint:0x7fa150730380 V:[_UILayoutGuide:0x7fa150734c60(0)]>",
"<_UILayoutSupportConstraint:0x7fa150732380 V:|-(0)-[_UILayoutGuide:0x7fa150734c60] (Names: '|':UIView:0x7fa150734a60 )>",
"<_UILayoutSupportConstraint:0x7fa150734200 V:[_UILayoutGuide:0x7fa150734d90(0)]>",
"<_UILayoutSupportConstraint:0x7fa150735110 _UILayoutGuide:0x7fa150734d90.bottom == UIView:0x7fa150734a60.bottom>"
)
IOS7 >
constraint (
"<NSLayoutConstraint:0x15d49890 H:[UIView:0x15d468c0]-(108)-| (Names: '|':UIView:0x15d44690 )>",
"<NSLayoutConstraint:0x15d4c460 V:|-(8)-[UIView:0x15d468c0] (Names: '|':UIView:0x15d44690 )>",
"<_UILayoutSupportConstraint:0x15d46740 V:[_UILayoutGuide:0x15d57a20(0)]>",
"<_UILayoutSupportConstraint:0x15d4f1b0 V:|-(0)-[_UILayoutGuide:0x15d57a20] (Names: '|':UIView:0x15d44690 )>",
"<_UILayoutSupportConstraint:0x15d54120 V:[_UILayoutGuide:0x15d4f780(0)]>",
"<_UILayoutSupportConstraint:0x15d46be0 _UILayoutGuide:0x15d4f780.bottom == UIView:0x15d44690.bottom>"
)
有人可以解释为什么会发生这样的事情(不同之处在于 whiteSquare 的上部空间正好是 8 点)? (毕竟 0 常量不应该改变)
谢谢。
【问题讨论】:
【参考方案1】:在 iOS8 中,约束被固定到视图的 UIView 的 layoutMargins
(默认为 8pt!),而不是实际的超级视图的框架。
layoutMargins
采用UIEdgeInsets
值,可让您明确定义视图可用于指导界面部分应放置的空白区域。 source
要解决此问题,请将您的视图直接限制在超级视图的顶部,而不是相对于边距。这可以在 IB 中完成。要在代码中执行此操作,您可以在 iOS8 中将超级视图的 layoutMargins
设置为 UIEdgeInsetsZero
。
【讨论】:
好吧,我现在感觉很笨。我已将 secondItem 属性更改为“顶部”而不是“相对于边距”,它的作用就像一个魅力。 我在 2 周前遇到了这个问题 :)以上是关于NSLayoutConstraint layout Margin 从 iOS 7 到 iOS 8 的变化的主要内容,如果未能解决你的问题,请参考以下文章