如何以编程方式更改布局边距

Posted

技术标签:

【中文标题】如何以编程方式更改布局边距【英文标题】: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 我不能。这是一些项目的非常简化的案例。我不是在构建红色矩形应用程序 :-) 好的,我在怀疑,所以我对你的问题的回答 我也认为这个答案的正确名称是如何以编程方式更改边距大小,因为这是您的主要问题还是我错了? 【参考方案1】:

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

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

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

【讨论】:

嗯,这将被多次调用。它虽然有效。没有其他地方/方法可以做到这一点吗?我不想在视图生命周期中动态更改它。 @ViktorKucera 检查这个问题***.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 的任何值

【讨论】:

以上是关于如何以编程方式更改布局边距的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 flexbox 均匀地显示内容卡,包括边距边 [重复]

以编程方式更新图像宽度和边距

以编程方式文本视图的布局边距

以编程方式在 RealtiveLayout 中设置 LinearLayout 的边距 - 不起作用

以编程方式设置边距不起作用

Android以编程方式设置在xml文件中声明的按钮边距? [复制]