我使用childViewController在项目中分离视图,但是发生了一些奇怪的问题,这是我的代码。

class ViewController: UIViewController {

    var container = UIView()
    var childVC = ChildViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        addChildViewController(childVC)
        childVC.didMove(toParentViewController: self)

        addChildView()

        setContainerFrame()
    }

    func setContainerFrame() {
        container.frame = CGRect(x: 0, y: 100, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height - 100)
        container.backgroundColor = .red
        view.addSubview(container)
    }

    func addChildView() {
        let frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
        childVC.view.frame = frame
        childVC.view.backgroundColor = .green
        container.addSubview(childVC.view)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("childVC.view.frame: \(childVC.view.frame)")
    }
}


class ChildViewController: UIViewController {
}

当我交换在ViewController的viewDidLoad()中调用func addChildView()和setContainerFrame()函数的顺序时,xcode控制台会打印不同的帧日志。

最佳答案

这是由于childVC.view的autoresizingMask所致。默认情况下,此设置为具有灵活的宽度和高度。因此,如果您先设置容器的框架,然后再设置childVC.view的框架,那么您将获得设置的实际值,但是如果您将其反转并先设置了childVC.view的框架,然后再设置容器,则将其设置为childVC的框架。视图将自动更新为具有相同的相对宽度和高度。

例如,如果容器的帧大小为100 x 100,然后将其更改为200 x 200,则childVC.view的帧大小将加倍。

要删除此设置,请将childVC.view.autoresizingMask = []保留为设置时的样子。

07-24 16:34