程序性约束

时间:2017-10-15 17:43:13

标签: ios swift

我认为我正确地这样做了,在尝试激活约束之前将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)会创建必要的层次结构。

1 个答案:

答案 0 :(得分:3)

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 }() 变量,从闭包中初始化:

SpeedButton