尝试以编程方式实现约束时忽略约束

Posted

技术标签:

【中文标题】尝试以编程方式实现约束时忽略约束【英文标题】:Constraints were ignored when trying to implement constraints programmatically 【发布时间】:2017-07-02 07:31:59 【问题描述】:

我试图通过设置约束使logoImage 水平和垂直居中,但在测试时,它显示在(x:0, y:0) 上。 知道如何解决这个问题吗? 谢谢

var movieView : UIView?
let logoImage = UIImageView(image: #imageLiteral(resourceName: "my_logo"))

// This function runs in viewWillAppear
internal func setupIntroMovie() 
    movieView = UIView(frame: view.frame)
    view.addSubview(movieView!)
    view.addSubview(logoImage)

    let horizontalConstraint = NSLayoutConstraint(item: logoImage,
                                                  attribute: .centerX,
                                                  relatedBy: .equal,
                                                  toItem: view,
                                                  attribute: .centerX,
                                                  multiplier: 1,
                                                  constant: 0)
    let verticalConstraint = NSLayoutConstraint(item: logoImage,
                                                attribute: .centerY,
                                                relatedBy: .equal,
                                                toItem: view,
                                                attribute: .centerY,
                                                multiplier: 1,
                                                constant: 0)
    view.addConstraints([horizontalConstraint,
                              verticalConstraint])
    updateViewConstraints()

【问题讨论】:

“错误”这个词太模糊了。在哪一行,完整的错误是什么? 什么“不起作用”?它没有像您期望的那样出现在屏幕上吗?应用程序崩溃了吗?日志中有警告吗? @Mr.Xcoder 抱歉,我忘了修正标题。它没有给我任何错误 @Slowpoke 那么问题出在哪里?它们是否以意想不到的方式出现在屏幕上? 【参考方案1】:

您需要设置logoImage.translatesAutoresizingMaskIntoConstraints = false,因为它决定视图的自动调整大小掩码是否转换为自动布局约束。

internal func setupIntroMovie() 
        movieView = UIView(frame: view.frame)
        view.addSubview(movieView!)
        view.addSubview(logoImage)

        let horizontalConstraint = NSLayoutConstraint(item: logoImage,
                                                      attribute: .centerX,
                                                      relatedBy: .equal,
                                                      toItem: view,
                                                      attribute: .centerX,
                                                      multiplier: 1,
                                                      constant: 0)
        let verticalConstraint = NSLayoutConstraint(item: logoImage,
                                                    attribute: .centerY,
                                                    relatedBy: .equal,
                                                    toItem: view,
                                                    attribute: .centerY,
                                                    multiplier: 1,
                                                    constant: 0)
        // Update 
        logoImage.translatesAutoresizingMaskIntoConstraints = false

        view.addConstraints([horizontalConstraint,
                             verticalConstraint])
        updateViewConstraints()
    

如果该属性的值为真,系统会创建一组 复制视图指定行为的约束 自动调整蒙版。这也允许您修改视图的大小和 使用视图的 frame 、 bounds 或 center 属性定位, 允许您在 Auto 中创建静态的、基于框架的布局 布局。

【讨论】:

以上是关于尝试以编程方式实现约束时忽略约束的主要内容,如果未能解决你的问题,请参考以下文章

约束布局中以编程方式添加的按钮将忽略约束 - Android

以编程方式添加 UIConstraints 时不应用尾随约束

如何以编程方式在 TableCell 中添加图像和添加约束?

以编程方式应用自动布局约束时无法同时满足约束

实体框架模型优先:以编程方式创建 UNIQUE 约束

目标 C:以编程方式添加带有约束的 UI 按钮