超视图中的中心视图

时间:2014-12-02 09:45:05

标签: ios swift autolayout constraints

我试图通过超级视图中的按钮来集中我的子视图。所以我希望子视图的中心成为超级视图的中心。我尝试使用以下代码:

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)

1 个答案:

答案 0 :(得分:2)

您的代码会触发断言:

  

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

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

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)
)