【问题标题】:Programmatic constraints编程约束
【发布时间】:2017-10-15 17:43:12
【问题描述】:

我认为我这样做是正确的,在尝试激活约束之前将 addItemButton 添加到 self.view,但它抛出了这个错误:

'无法使用锚激活约束,因为它们没有共同的祖先。约束或其锚点是否引用不同视图层次结构中的项目?这是非法的。'

var addItemButton: UIButton{
    let button = UIButton()
    let dim: CGFloat = 64.0

    button.frame = CGRect(x: 0, y: 0, width: dim, height: dim)
    button.tintColor = Constants.color4
    button.layer.cornerRadius = dim / 2
    button.layer.masksToBounds = true

    button.translatesAutoresizingMaskIntoConstraints = false

    return button
}

extension MainViewController{
func setupView(){
    view.addSubview(itemsCollectionView)

    view.addSubview(addItemButton)
    addItemButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    addItemButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}
}

我认为 view.addSubView(addItemButton) 会创建必要的层次结构。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    var addItemButton: UIButton { 是一个计算变量。每次访问它时,都会创建一个新的按钮实例,因此在

    view.addSubview(addItemButton)
    addItemButton.centerXAnchor. ...
    

    每一行的addItemButton 是一个新对象。创建了一个按钮,然后您尝试将约束添加到完全不同的按钮。

    您应该将变量转换为 lazy 一个,从闭包初始化:

    lazy var addItemButton: UIButton = {
        let button = UIButton()
        let dim: CGFloat = 64.0
    
        button.frame = CGRect(x: 0, y: 0, width: dim, height: dim)
        button.tintColor = Constants.color4
        button.layer.cornerRadius = dim / 2
        button.layer.masksToBounds = true
    
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      相关资源
      最近更新 更多