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 的变化的主要内容,如果未能解决你的问题,请参考以下文章

NSLayoutConstraint 使用详解

在 Auto Layout 的视觉格式语言中使用可选值

使用Auto Layout中的VFL(Visual format language)--代码实现自动布局转

NSLayoutConstraint 激活/停用

NSLayoutConstraint 问题

如何检查 NSLayoutConstraint 是不是动画