UIView出现错误的中心位置

时间:2015-01-29 23:08:24

标签: ios xcode swift uiviewcontroller xcode6

在以下函数中,我定义了UIView的所有必要特征:

func OpenController() {
    var gameOverView: UIView = UIView()

    gameOverView.center = super.view.center
    gameOverView.frame.size = CGSize(width: 200, height: 300)
    gameOverView.backgroundColor = UIColor.grayColor()

    self.view.addSubview(gameOverView)
}

即使我定义了UIView" gameOverView"的中心。与它所驻留的viewcontroller一样,它出现在viewcontroller中心的一个角落,而不是在viewcontroller中居中。我已经尝试了各种其他方法来定义位置(NSLayoutConstraints,frame.x,frame.y等),但都有这个结果。

如果有人能告诉我为什么会这样,以及如何将UIView置于其父视图控制器中,我将非常感激!

2 个答案:

答案 0 :(得分:10)

这里的问题是您的中心正在设置之前。由于您在没有框架参数的情况下创建视图,因此框架为{0,0}。

因此,您目前正在将子视图居中,然后调整其大小,因此发生了这种情况:

Centering a {0, 0} subview Resizing after centering the {0, 0} subview

您需要做的是调整子视图的大小,然后将其居中,如下所示:

Resizing a subview Centering a subview

所以你可以交换你的居中和框架逻辑:

gameOverView.frame.size = CGSize(width: 200, height: 300)
gameOverView.center = super.view.center

否则在创建视图时更容易通过框架(您甚至可以传入正确的x,y坐标以使其居中):

var gameOverView: UIView = UIView(frame: CGRectMake(0, 0, 200, 300))

答案 1 :(得分:2)

设置尺寸后,您必须设置视图的中心。这是因为在设置视图的大小或框架之前,其框架rect是(x:0,y:0,width:0,height:0)。如果然后立即设置其中心,则大小为零的视图将居中,因此其新帧rect可以是(x:20,y:20,width:0,height:0)(如果父视图为40x40)。如果您现在更改视图的大小,视图的原点将不会实际移动,因此新帧可能是(x:20,y:20,其中:5,高度:5),这意味着视图是不再居中。

因此,要使视图居中,您必须首先设置其大小及其中心。