0

苹果 说:

“容器视图控制器使用此方法返回其子视图控制器的大小。UIKit 调用该方法作为视图控制器的 viewWillTransition(to:with:) 方法的默认实现的一部分”

当我第一次启动程序时:

class ViewController: UIViewController {
                       
override func viewDidLoad() {
    super.viewDidLoad()
    
    let child = ViewControllerChild()
    self.addChildViewController(child)
    self.view.addSubview(child.view)
                    
   
    child.view.translatesAutoresizingMaskIntoConstraints = true
    child.view.autoresizingMask = [.flexibleBottomMargin, .flexibleRightMargin]       
}

override func size(forChildContentContainer container: UIContentContainer, withParentContainerSize parentSize: CGSize) -> CGSize {
    return CGSize(width: 100, height: 100)
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
}

我得到完整的父 vc 视图的大小子视图控制器的视图不是 (100, 100)。那么重写它的真正意义是什么,如果我可以通过在(viewdidload 中的第一次加载)然后在preferredContentSizeDidChange 函数中重新定义子vc 视图的框架来响应特征变化?

在此处输入图像描述

4

2 回答 2

1

根据您在问题中的说明:

UIKit 调用该方法作为视图控制器的 viewWillTransition(to:with:) 方法的默认实现的一部分

问题:您确定正在调用重写的方法吗?

少了什么东西?

let child = ViewControllerChild()
self.addChild(child)

/// Add this line
child.didMove(toParent: self)

self.view.addSubview(child.view)

文档:https ://developer.apple.com/documentation/uikit/uiviewcontroller/1621405-didmovetoparentviewcontroller

如果您正在实现自己的容器视图控制器,它必须在转换到新控制器后调用子视图控制器的 didMove(toParent:) 方法,或者,如果没有转换,则在调用 addChild(_: ) 方法。

于 2020-12-17T06:05:39.410 回答
-1

您需要触发大小更改事件或实际更改视图的大小,以便viewWillTransition可以调用该方法。在您的代码中,将永远不会调用该方法,因为没有视图的大小更改操作。 viewWillTransition方法通知容器其视图的大小即将改变。

请参考此代码以获得最佳实践。

关于 sizeForChildContentContainer 方法的编辑,这里是可以通过的详细用例,将帮助您了解用法。

于 2020-12-16T16:22:42.437 回答