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