自动布局: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 时感到困惑

自动布局是拉伸图像,自动布局,ios

在 iOS 6 中启用自动布局,在 < iOS6 中禁用自动布局

UGUI笔记5-自动布局

按钮和自动布局

iOS scrollView自动布局技巧之二 - 纯代码自动布局