【问题标题】:How to change the layout margins programmatically如何以编程方式更改布局边距
【发布时间】:2017-08-24 12:54:54
【问题描述】:

我在viewDidLoad 中的设置非常简单,只需添加一个视图并通过“锚”样式将其固定到超级视图的边缘:

let myView = UIView(frame: .zero)
myView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(myView)
myView.backgroundColor = UIColor.red
myView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
myView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor).isActive = true
myView.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor).isActive = true
myView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor).isActive = true
view.layoutMargins = .zero

问题是在模拟器中运行时仍有余量。为什么 layoutMargins 置零被忽略?

【问题讨论】:

  • 如果你想要零,为什么不直接使用view.leadingAnchor
  • 我不能。这是一些项目的非常简化的案例。我不是在构建红色矩形应用程序 :-)
  • 好的,我在怀疑,所以我对你的问题的回答
  • 我也认为这个答案的正确名称是如何以编程方式更改边距大小,因为这是您的主要问题还是我错了?

标签: ios swift autolayout


【解决方案1】:

你需要在你的 UIViewController viewWillLayoutSubviews() 方法中添加这个

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    view.layoutMargins = .zero
    view.layoutMarginsDidChange()
}

但如果您需要.zero 的边距,您可以像我在 cmets 中所说的那样使用 view.leadingAnchor 以及

【讨论】:

  • 嗯,这将被多次调用。它虽然有效。没有其他地方/方法可以做到这一点吗?我不想在视图生命周期中动态更改它。
  • @ViktorKucera 检查这个问题stackoverflow.com/questions/27421469/… 似乎这是我们拥有的最好的镜头,但您可以添加一个子视图作为替代解决方案
  • 是的,对我来说确实被忽略是一个 Apple 的错误,但我们所拥有的就是这样......没有什么可做的了@ViktorKucera
  • iOS11 中修复了,我刚刚在 Xcode beta 中尝试过。感谢您的帮助。
  • 我很高兴听到 Apple 正在修复他的错误,@ViktorKucera
【解决方案2】:

试试这个。

if #available(iOS 11, *) {
   viewRespectsSystemMinimumLayoutMargins = false
   view.layoutMargins = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)
}

Apple document 供参考。

【讨论】:

    【解决方案3】:

    这似乎已针对iOS 11 进行了修复/更改。较低的版本不走运。

    我已经在this question详细阐述了

    【讨论】:

      【解决方案4】:

      不要忘记self.view.insetsLayoutMarginsFromSafeArea = false,它将添加到您设置为self.view.directionalLayoutMarginsself.view.layoutMargins 的任何值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 2012-07-15
        • 1970-01-01
        相关资源
        最近更新 更多