以编程方式将UIButton中心转到Superview类(Swift 3)

时间:2017-03-30 13:37:02

标签: ios swift swift3 uibutton

我正在尝试在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中,我创建了Horizo​​ntal Stack View并将其设置为自定义类ButtonsController。我希望Play按钮在该视图中居中,这就是为什么我使用“self.centerXAnchor”作为Superview的参考。

但是模拟器崩溃并出现错误:

  

由于未捕获的异常'NSGenericException'而终止应用,   原因:'无法使用锚点激活约束   (NSLayoutXAxisAnchor:0x60800026c680“UIButton:0x7feba5d112f0.centerX”)   和(NSLayoutXAxisAnchor:0x60800026c700   “player.ButtonsController:0x7feba5c0e390.centerX”)因为他们有   没有共同的祖先。约束或其锚点是否引用   不同视图层次结构中的项目?这是非法的。'

我实际上如何在该课程中引用Superview?

1 个答案:

答案 0 :(得分:3)

第一个问题是,在将视图添加为子视图之前,您尝试添加约束(引用其他视图)。您应该首先将其添加为子视图,然后创建约束。这将摆脱崩溃。

addArrangedSubview(playButton)
playButton.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true

另外,我不知道你在这里想要实现什么,为什么你使用UIStackView作为容器。那个约束可能会给你带来麻烦。您正在将UIButton添加为“已排列的子视图”,这意味着它将自动创建约束。如果您相应地配置了UIStackView(它的分布属性等),您可以激活一些约束,如宽度。但是centerX在水平堆栈视图上存在问题。您可以尝试将堆栈视图集中在其超级视图中,或者不要将您的uibutton添加为arrangesubview,将其添加为子视图:

addSubview(playButton)