自动布局:layoutMarginsGuide

如何重写视觉格式

addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|-[label]-|", options: .AlignAllBaseline, metrics: nil, views: ["label": label])) addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[label]-|", options: .AlignAllCenterX, metrics: nil, views: ["label": label])) 

通过移动到布局指南(利润率)?

我试了一下

 label.topAnchor.constraintEqualToAnchor(layoutMarginsGuide.topAnchor).active = true label.leftAnchor.constraintEqualToAnchor(layoutMarginsGuide.leftAnchor).active = true label.bottomAnchor.constraintEqualToAnchor(layoutMarginsGuide.bottomAnchor).active = true label.rightAnchor.constraintEqualToAnchor(layoutMarginsGuide.rightAnchor).active = true 

但不起作用。 即使layoutMarginsGuide.layoutFrame没有期望的值(是的,我执行super后在layoutSubviews调用它)。 约束条件已经设定好,但是却没有边界。 只有在布局边距设置为负时,才会布局并给出预期的布局layoutFrame ; 这显然不是我想要的,但是表明约束条件是用边距指南设置的。 看起来我错过了一些东西…

在我看来,layoutMarginsGuide没有准备好UIView的init方法。 我也遇到了类似的问题,在updateConstraints中设置约束条件就可以了。 仍在调查为什么。

更新:我试图做的是在视图添加到超级视图之前(在init中)设置layoutMargins。 这没有用。 什么工作是相对于layoutMarginsGuide在init中设置约束,但实际上将layoutMargins设置为viewDidMoveToSuperView。

我做了一些关于这个的研究,因为我们现在已经有了iOS 10.这是我发现的:

  • 它仍然不能可靠地工作。 我的意思是在指定的初始化器中设置相对于版面边距的约束,而不需要进一步的操作。
  • 它工作正常,如果框架大小> =布局利润特定的大小。
  • 否则,如果您要调用layoutMarginsGuide (甚至只是在print ,我们仍然在讨论初始化程序中的调用),那么即使在稍后的调用(例如didMoveToWindow )中,也会破坏本指南。 你可以通过设置新的layoutMargins来修复它(但新的值必须与旧的不同)。

我认为这是一个错误,并提交(请将其提交,因此可以优先修复)。