Swift - Xcode 8 - iOS 10 - 无法创建简单约束

Posted

技术标签:

【中文标题】Swift - Xcode 8 - iOS 10 - 无法创建简单约束【英文标题】:Swift - Xcode 8 - iOS 10 - Can't create simple constraint 【发布时间】:2016-09-18 03:35:59 【问题描述】:

编辑 - 我修好了。查看答案。

我正在尝试学习如何以编程方式创建约束。我试图将UILabel 限制在屏幕顶部,使用此代码,在viewDidLoad

override func viewDidLoad() 
    super.viewDidLoad()

    //the variable label already exists. I make a UILabel.
    label = UILabel()
    label.text = "Hello"
    label.backgroundColor = UIColor(red: 1, green: 1, blue: 0, alpha: 1)

    //I add the label to the ViewController
    view.addSubview(label)

    //I use an array of constraints because I will make more later.
    let constraints : [NSLayoutConstraint] = [
        NSLayoutConstraint(item: label, attribute: .top, relatedBy: .equal, toItem: topLayoutGuide, attribute: .bottom, multiplier: 1.0, constant: 0.0)
    ]
    view.addConstraints(constraints)

当我运行我的应用程序时,我收到一个以以下开头的错误:

[LayoutConstraints] 无法同时满足约束。

我对约束的预期方程式是:

label.top = 1.0 * topLayoutGuide.bottom + 0.0

当我使用 Interface Builder 创建似乎相同的约束时,它起作用了。但是,当我尝试以编程方式执行此操作时,它不会。我在做什么有什么问题,我如何以编程方式使用NSLayoutConstraint 进行约束,将我的标签固定在状态栏下方的屏幕顶部?

我的来源:

Apple - Anatomy of a Constraint

Apple - Programmatically creating Constraints

*** - SWIFT | Adding constraints programmatically

【问题讨论】:

Fwiw,如果您正在做很多编程约束,请查看 SnapKit 或其他一些 AutoLayout 框架,让您的生活轻松一百万倍。 @brandonscript 我知道,我宁愿使用 IB 或其他东西,但我想了解如何以编程方式进行。 【参考方案1】:

这可以通过将translatesAutoresizingMaskIntoConstraints 设置为 false 来解决,以避免与现有的掩码约束冲突:

label.translatesAutoresizingMaskIntoConstraints = false

【讨论】:

以上是关于Swift - Xcode 8 - iOS 10 - 无法创建简单约束的主要内容,如果未能解决你的问题,请参考以下文章

导航不出现 Xcode 8.1 iOS 10 Swift 3

Xcode 8.3 Swift 3 FCM 通知上的 Firebase 问题 iOS 10.3 不起作用

如何在 Xcode 8 和 iOS 10 中使用 AFNetworking 类和 Swift 3 上传图像

Swift 3、iOS 10+、xCode 8.3+、Quickblox - 在保持纵横比/视频分辨率的同时切换全屏远程流

我如何通过 swift 2.3 项目支持 iOS 版本 10.3

UIPopoverController、Xcode 6、IOS 8 使用 Swift