自动布局:layoutMarginsGuide
Posted
技术标签:
【中文标题】自动布局:layoutMarginsGuide【英文标题】:Auto Layout: layoutMarginsGuide 【发布时间】:2015-09-21 11:31:02 【问题描述】:如何重写视觉格式
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
;这显然不是我想要的,但表明约束是通过边距指南设置的。看来我错过了什么……
【问题讨论】:
【参考方案1】:在我看来 layoutMarginsGuide 在 UIView 的 init 方法中还没有准备好。我也遇到了类似的问题,在 updateConstraints 中设置约束就可以了。仍在调查原因。
更新:我试图做的是在视图被添加到超级视图(在 init 中)之前设置 layoutMargins。那没有用。起作用的是在 init 中设置约束,相对于 layoutMarginsGuide,但实际上是在 viewDidMoveToSuperView 中设置 layoutMargins。
【讨论】:
如果你发现了什么,请分享。 好吧...不错的收获,但这对我来说没有意义。此外,新的layoutMargins
的值必须不同。同样的问题:forums.developer.apple.com/message/93313。似乎是一个错误。
我自己永远也想不通。非常感谢!
我也遇到过类似的问题,但是在 UIView 中无法访问 viewDidMoveToSuperView 我把它放在updateConstraints
,看我的回答***.com/a/40461444/897465
这很荒谬,但这解决了问题。我花了一整天的时间试图弄清楚我做错了什么。谢谢。【参考方案2】:
自从我们现在有 ios 10 以来,我对此进行了一些研究。以下是我的发现:
它仍然不能可靠地工作。我的意思是在指定的初始化程序中设置与布局边距指南相关的约束,无需进一步操作。 如果框架尺寸 >= 特定尺寸的布局边距,它可以正常工作。 否则,如果您要调用layoutMarginsGuide
(即使仅在 print
中,我们仍在讨论初始化程序中的调用),您将破坏本指南,因此即使在以后的调用中(例如在 didMoveToWindow
中)它也不起作用然后。您可以通过设置新的layoutMargins
来修复它(但新值必须与旧值不同)。
我认为这是一个错误并已提交(请同时提交,以便优先修复)。
【讨论】:
如果您也可以在 OpenRadar 上发布雷达,并在此处提及您的雷达编号,我们更容易复制,并且 Apple 窥视者将雷达相互连接起来的工作也更少。感谢您发布此信息,对我帮助很大! openradar.appspot.com/30462133 和“如果框架尺寸 >= 特定尺寸的布局边距,它可以正常工作。”这行得通。【参考方案3】:我实际上发现你可以在 init
中设置 layoutMargins 以及你的约束没有任何问题。
只需要设置
self.translatesAutoresizingMaskIntoConstraints = false
(是的,自我)
如果不这样做,则不会破坏任何约束,尽管边距不起作用(在 iOS 10 中)
【讨论】:
【参考方案4】:包含解决方法的可重用视图 layoutMarginsGuide
问题 (Swift 4)。
open class View: UIView
public override init(frame: CGRect)
var adjustedFrame = frame
if frame.size.width == 0
adjustedFrame.size.width = CGFloat.greatestFiniteMagnitude
if frame.size.height == 0
adjustedFrame.size.height = CGFloat.greatestFiniteMagnitude
super.init(frame: adjustedFrame)
#if !TARGET_INTERFACE_BUILDER
initializeView()
#endif
public required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
open override func awakeFromNib()
super.awakeFromNib()
initializeView()
open func initializeView()
// Do something in child classes.
【讨论】:
以上是关于自动布局:layoutMarginsGuide的主要内容,如果未能解决你的问题,请参考以下文章
试图理解 tableView 的自定义部分 Header 中的 .layoutMarginsGuide 时感到困惑