首页 > 解决方案 > 大小(forChildContentContainer 容器:UIContentContainer,withParentContainerSize parentSize:CGSize)不起作用

问题描述

苹果 说:

“容器视图控制器使用此方法返回其子视图控制器的大小。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 视图的框架来响应特征变化?

在此处输入图像描述

标签: iosswiftchildviewcontrollerviewwilltransitiontosize

解决方案


根据您在问题中的说明:

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(_: ) 方法。


推荐阅读