以编程方式添加的约束不起作用

Posted

技术标签:

【中文标题】以编程方式添加的约束不起作用【英文标题】:Programmatically Added Constraint Not Working 【发布时间】:2016-04-16 13:33:51 【问题描述】:

我一直在尝试以编程方式向视图添加约束,我也在以编程方式向视图控制器添加约束。但是,似乎没有遵循约束。

视图已添加到视图控制器的情节提要中,但直到稍后才真正添加到视图控制器的视图中(请参见下面的屏幕截图)。

我尝试添加各种约束,但到目前为止都没有奏效。我现在已将其简化为下面的单个约束,即使这样也行不通。我做错了什么?

@IBOutlet var loadingView: LoadingView!

override func viewDidLoad() 
    super.viewDidLoad()
    displayLoadingView(true)


func displayLoadingView(display: Bool) 
    if display 
        view.addSubview(loadingView)

        let widthConstraint = NSLayoutConstraint(item: loadingView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50.0)

        view.addConstraint(widthConstraint)
    

【问题讨论】:

你设置view.translatesAutoresizingMaskIntoConstraints = false了吗?或以编程方式设置约束的任何视图 @Pyro 这正是我所缺少的。自从您第一次发布此内容以来,您可以将其发布为答案吗? 【参考方案1】:

translatesAutoresizingMaskIntoConstraints = false 设置为您以编程方式设置约束的任何视图。

来自apple doc: translatesAutoresizingMaskIntoConstraints

如果要使用自动布局来动态计算视图的大小和位置,则必须将此属性设置为 false,然后为视图提供一组明确、不冲突的约束。

【讨论】:

实际上我必须设置loadingView.translatesAutoresizingMaskIntoConstraints = false 才能正常工作。但是这个答案肯定让我得到了我需要的地方。谢谢! 我对以编程方式添加约束并不陌生,但我仍然经常忘记这个小标志,想知道为什么我的约束不起作用。【参考方案2】:

您没有设置所有必要的约束,这可能是原因。考虑以下粗略的例子。 MyView 接口在独立的 xib 文件中定义。希望对您有所帮助:

 class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        guard let myView = loadFromNib("MyView") else 
            return
        

        view.addSubview(myView)

        myView.translatesAutoresizingMaskIntoConstraints = false
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-15-[myView]-15-|", options: NSLayoutFormatOptions.DirectionLeadingToTrailing, metrics: nil, views: ["myView": myView]))

        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-15-[myView]-15-|", options: NSLayoutFormatOptions.DirectionLeadingToTrailing, metrics: nil, views: ["myView": myView]))
    

    func loadFromNib(cls: String) -> UIView? 

        return  NSBundle.mainBundle().loadNibNamed(cls, owner: nil, options: nil)[0] as? UIView
    

【讨论】:

@Pyro 首先发布了translatesAutoresizingMaskIntoConstraints,这正是我所需要的。但我很高兴看到constraintsWithVisualFormat。这已经很有用了。

以上是关于以编程方式添加的约束不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中以编程方式添加约束不起作用

以编程方式自动布局不起作用

以编程方式制作的约束不起作用

编程约束在 UICollectionViewCell Swift 中不起作用

以编程方式创建布局,使用堆栈视图和约束不起作用

ios UIViewController以编程方式定位按钮不起作用