超级视图中的中心视图

Posted

技术标签:

【中文标题】超级视图中的中心视图【英文标题】:Center View in superview 【发布时间】:2014-12-02 09:45:04 【问题描述】:

我正在尝试使用其父视图中的按钮使我的子视图居中。所以我希望子视图的中心成为超级视图的中心。我正在尝试使用以下代码:

override func viewDidLoad() 
    self.view.backgroundColor = UIColor.redColor()

    var menuView = UIView()
    var newPlayButton = UIButton()
    //var newPlayImage = UIImage(named: "new_game_button_5cs")
    var newPlayImageView = UIImageView(image: UIImage(named: "new_game_button_5cs"))
    newPlayButton.frame = CGRectMake(0, 0, newPlayImageView.frame.width, newPlayImageView.frame.height)
    newPlayButton.setImage(newPlayImage, forState: .Normal)
    newPlayButton.backgroundColor = UIColor.whiteColor()

    menuView.backgroundColor = UIColor.whiteColor()
    menuView.addSubview(newPlayButton)

    menuView.addConstraint(
        NSLayoutConstraint(item: self.view,
            attribute: .CenterX,
            relatedBy: .Equal,
            toItem: menuView,
            attribute: .CenterX,
            multiplier: 1, constant: 0)
    )

不幸的是,当我尝试运行该程序时,它会中断。 (线程 1:信号 SIGABRT)

【问题讨论】:

添加异常断点查看崩溃的地方:developer.apple.com/library/ios/recipes/… 【参考方案1】:

你的代码触发了一个断言:

当添加到视图时,约束的项必须是 该视图(或视图本身)。

这意味着您必须在添加约束之前将menuView 作为子视图添加到self.view。您还应该将约束添加到self.view,而不是menuView。最后但同样重要的是,通过调用setTranslatesAutoresizingMaskIntoConstraints(false) 删除隐式添加到menuView 的自动调整掩码约束,否则自动布局将抱怨约束冲突。

menuView.addSubview(newPlayButton)
menuView.setTranslatesAutoresizingMaskIntoConstraints(false)

self.view.addSubview(menuView)
self.view.addConstraint(
    NSLayoutConstraint(item: self.view,
        attribute: .CenterX,
        relatedBy: .Equal,
        toItem: menuView,
        attribute: .CenterX,
        multiplier: 1, constant: 0)
)

【讨论】:

以上是关于超级视图中的中心视图的主要内容,如果未能解决你的问题,请参考以下文章

如何获得相对于滚动视图超级视图的滚动视图子视图的中心点?

在超级视图的中心保持两个可变宽度视图靠近在一起的约束

iOS - 以编程方式使用自动布局将 UIView 定位在超级视图的中心

如何以编程方式使用自动布局将活动指示器定位到其超级视图的中心?

UIVisualEffectView 不会模糊它的 SKView 超级视图

SwiftUI 如何将视图的前导对齐到最超级视图的前导?