我正在尝试在UIStackView子类的视图中居中按钮。
// ButtonsController.swift
// player
@IBDesignable class ButtonsController: UIStackView {
override init(frame: CGRect) {
super.init(frame: frame)
setupControls()
}
required init(coder: NSCoder) {
super.init(coder: coder)
setupControls()
}
private func setupControls(){
//Buttons variables
let playButton = UIButton()
playButton.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
addArrangedSubview(playButton)
}
在Storyboard中,我创建了Horizontal Stack View并将其设置为自定义类ButtonsController。我希望Play按钮在该视图中居中,这就是为什么我使用“self.centerXAnchor”作为Superview的参考。
但是模拟器崩溃并出现错误:
由于未捕获的异常'NSGenericException'而终止应用, 原因:'无法使用锚点激活约束 (NSLayoutXAxisAnchor:0x60800026c680“UIButton:0x7feba5d112f0.centerX”) 和(NSLayoutXAxisAnchor:0x60800026c700 “player.ButtonsController:0x7feba5c0e390.centerX”)因为他们有 没有共同的祖先。约束或其锚点是否引用 不同视图层次结构中的项目?这是非法的。'
我实际上如何在该课程中引用Superview?
答案 0 :(得分:3)
第一个问题是,在将视图添加为子视图之前,您尝试添加约束(引用其他视图)。您应该首先将其添加为子视图,然后创建约束。这将摆脱崩溃。
addArrangedSubview(playButton)
playButton.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
另外,我不知道你在这里想要实现什么,为什么你使用UIStackView作为容器。那个约束可能会给你带来麻烦。您正在将UIButton添加为“已排列的子视图”,这意味着它将自动创建约束。如果您相应地配置了UIStackView(它的分布属性等),您可以激活一些约束,如宽度。但是centerX在水平堆栈视图上存在问题。您可以尝试将堆栈视图集中在其超级视图中,或者不要将您的uibutton添加为arrangesubview,将其添加为子视图:
addSubview(playButton)