在UIView中居中的子视图不能在swift中工作吗?

时间:2015-10-04 00:54:49

标签: ios swift uiview

我在UIView( outerView )中有一个UIView(称为 innerView )。 outerView具有Autolayout约束,并始终以根视图为中心。 innerView只是在没有任何约束的情况下随意放置在outerView中。它们都通过网点链接到视图控制器。

我希望innerView始终在outerView中居中。当然,我可以使用autolayout,但我只需要测试我是否可以通过代码移动它(因为我发现它在我的真实项目中是一个问题)

不幸的是,我发现我无法使用代码移动innerView。谁知道原因?

这是代码:

import UIKit

class ViewController: UIViewController {

    // outerView is 300 X 300
    @IBOutlet weak var outerView: UIView!

    // innerView is 140 X 140, and it is the subview of outerView
    @IBOutlet weak var innerView: UIView!

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        innerView.center = CGPoint(x: outerView.bounds.midX, y: outerView.bounds.midY)
        innerView.autoresizingMask = .None
        // result is : (150.0, 150.0) which is correct
        print(innerView.center)
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        // result is : (78.0, 222.0) which is not correct
        print(innerView.center)
    }
}

2 个答案:

答案 0 :(得分:1)

viewDidLayoutSubviews开始,只是一个通知您的事件,即viewcontroller的根视图的所有子视图都位于所需的位置。您无法保证这些子视图的所有其余子视图也将对齐,因为它是父视图本身的责任。

将中心内部视图代码移动到:

    override func viewDidAppear(animated: Bool){
        super.viewDidAppear(animated)
        innerView.center = CGPoint(x:outerView.bounds.midX , y:outerView.bounds.midY)
}

如果支持方向:

override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
innerView.center = CGPoint(x:outerView.bounds.midX , y:outerView.bounds.midY)
    }

答案 1 :(得分:1)

试试这个:

innerView.center = outerView.convertPoint(outerView.center, fromView: outerView.superview)