带有 VFL 的 NSLayoutConstraint 仅在使用 '|' 时水平工作

Posted

技术标签:

【中文标题】带有 VFL 的 NSLayoutConstraint 仅在使用 \'|\' 时水平工作【英文标题】:NSLayoutConstraint with VFL is working only horizontally when using '|'带有 VFL 的 NSLayoutConstraint 仅在使用 '|' 时水平工作 【发布时间】:2017-07-28 16:25:15 【问题描述】:

我有以下 UIView 的实现..

struct LoginView 
let loginView: UIView = UIView()

func layoutLoginView() -> UIView 

    loginView.translatesAutoresizingMaskIntoConstraints = false
        loginView.backgroundColor = UIColor.purple

    return loginView
   

然后,我在 viewcontroller 中 subview 如下..

class LoginVC: UIViewController 

private let instanceOfLoginView = LoginView()

override func loadView() 
    super.loadView()

    view.addSubview(instanceOfLoginView.layoutLoginView())

NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[loginView]-|", options: [], metrics: [:], views: ["loginView":instanceOfLoginView.layoutLoginView()]))

NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[loginView]-|", options: [], metrics: [:], views: ["loginView":instanceOfLoginView.layoutLoginView()]))


问题在于,只有 NSLayout 的 'H' 一侧在工作 - 请查看下面的屏幕截图 -。 'V' 不起作用。

但是,当我应用以下"V:|-8-[loginView]-8-|" 时,它可以工作!!!

您能告诉我为什么"V:|-[loginView]-|" 不能正常工作吗?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

使用 VFL 时,- 字符表示“使用标准间距”

在你的情况下:

    "H:|-[loginView]-|"
    "V:|-[loginView]-|"

您是说“使用 布局边距,默认情况下:

    UIEdgeInsets(top: 0.0, left: 16.0, bottom: 0.0, right: 16.0)

ios 11 之前,无法更改由视图控制器管理的根视图的 .layoutMargins。要让紫色视图覆盖整个视图,请将 VFL 更改为:

    "H:|[loginView]|"
    "V:|[loginView]|"

【讨论】:

感谢您的努力。真的很有帮助。感谢您指导像我这样的新手。快速提问,在 iOS 11 之前说,这是否意味着当 11 出来时这种情况正在改变..? 是的 - 请参阅 Apple 的文档,或:useyourloaf.com/blog/changing-root-view-layout-margins

以上是关于带有 VFL 的 NSLayoutConstraint 仅在使用 '|' 时水平工作的主要内容,如果未能解决你的问题,请参考以下文章

VFL语言

AutoLayout - VFL

iOS学习之VFL语言简介

vfl

Autolayout开发之VFL语句

使用自动布局 VFL 垂直堆叠一组按钮