以编程方式将 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 中,我创建了 Horizontal 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)的主要内容,如果未能解决你的问题,请参考以下文章