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

Posted

技术标签:

【中文标题】以编程方式将 UIButton 居中到 Superview 类(Swift 3)【英文标题】:Center UIButton to Superview class programmatically (Swift 3) 【发布时间】:2017-03-30 13:37:02 【问题描述】:

我正在尝试在 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。我希望播放按钮在该视图中居中,这就是为什么我使用“self.centerXAnchor”作为对 Superview 的引用。

但模拟器因错误而崩溃:

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

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

【问题讨论】:

不设置约束。只需addArrangedSubview。如果布局不符合您的需要,请更改 UIStackView 的属性,因为它会处理其子视图的布局。 【参考方案1】:

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

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

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

addSubview(playButton)

【讨论】:

谢谢,问题解决了!我也一定会考虑你的第二个建议。

以上是关于以编程方式将 UIButton 居中到 Superview 类(Swift 3)的主要内容,如果未能解决你的问题,请参考以下文章

自动居中以编程方式创建的 UIButtons

如何以编程方式创建按钮?

以编程方式将 UIButton 添加到 UITableView 错误点

以编程方式将 IBAction 添加到 UIButton

(Swift) 以编程方式将 UIButton 约束到角落

以编程方式将 UIButton 添加到 rootview,我做错了啥?