【问题标题】:Can't change default layoutMargins of view无法更改视图的默认 layoutMargins
【发布时间】:2014-11-05 06:52:26
【问题描述】:

由于 ios 8.0 视图有额外的layoutMargins,默认情况下每边都有 8 个点值。

当我尝试更改 viewDidLoad 中的边距时,它似乎对子视图没有影响:

override func viewDidLoad(){
    super.viewDidLoad()
    self.view.layoutMargins = UIEdgeInsets(top:100, left:100, bottom:100, right:100)

}

..itd 似乎没有任何作用和

【问题讨论】:

标签: ios objective-c swift


【解决方案1】:

您正在尝试设置视图控制器的根视图的布局边距。在布局边距方面,根视图的行为与层次结构中的任何其他视图都不同。

根视图的布局边距由视图控制器专门管理,您不能设置它们。

来自 Apple 文档:

如果视图是视图控制器的根视图,系统会设置和管理边距。顶部和底部边距设置为零点。边距因当前尺寸等级而异,但可以是 16 或 20 磅。您无法更改这些边距。

https://developer.apple.com/reference/uikit/uiview/1622566-layoutmargins

【讨论】:

    【解决方案2】:

    我使用 KVO 来检测 view.layoutMargins 的变化。而且我发现视图本身在layoutSubViews处理期间自定义后会改变layoutMargins。

    所以只需将您的自定义代码放入viewDidLayoutSubviews 方法中:

    - (void)viewDidLayoutSubviews
    {
        self.view.layoutMargins = UIEdgeInsetsMake(100.0f, 100.0f, 100.0f, 100.0f);
    }
    

    PS:通过这些代码都是OC,但我认为它也可以为Swift工作。希望这对你有用!

    【讨论】:

    • 1.与每个人在here 的答案中所说的相反,我能够使用它来更改我的 ViewController 视图的 layoutMargins。 2.我实际上认为在实例化时更改子视图的 layoutMargin 不会有任何限制,但实际上似乎对子视图设置了这样的限制,因为我的修改都不起作用。更改子视图边距的唯一地方是viewDidLayoutSubviews
    【解决方案3】:

    我不确定是什么问题。

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.layoutMargins = UIEdgeInsets(top:100, left:100, bottom:100, right:100)
        println(self.view.layoutMargins.top)
        println(self.view.layoutMargins.left)
        println(self.view.layoutMargins.right)
        println(self.view.layoutMargins.bottom)
    }
    

    这为每个边距打印 100。如果您尝试设置该视图的子视图的边距,则还需要显式设置它们。 self.view.layoutMargins 的调用只影响 self.view 的 layoutMargins。

    如果您希望视图的子视图尊重视图父视图的 layoutMargins,则需要在视图上设置 preservesSuperviewLayoutMargins。

    Reference Documentation

    【讨论】:

    • 应该添加其他信息 - 当我 println 布局值时,我得到默认值而不是 100'a
    • @aldorain 您确定要更改正确视图的 layoutMargins 吗?除非幕后发生了一些你没有展示的事情,否则你没有理由为完全相同的代码得到不同的结果。
    • 它们在viewWillAppearviewDidAppear 之间的某个时间被改回——然后由于目前未知的原因将继续更改。我还没有找到合适的钩子来保留自定义边距。
    • 我使用 KVO 来检测 view.layoutMargins 的变化。而且我发现view本身在customize之后会改变layoutMargins。
    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多