iOS中如何通过代码调整容器视图控制器的尺寸?
解决容器视图控制器尺寸适配问题
你遇到的问题很典型——虽然在Storyboard里给容器VC设置了Freeform自定义尺寸,但手动添加子控制器视图时,没有让它和容器视图的尺寸绑定,所以它还是沿用了Storyboard默认的375x667大小。这里有两种可靠的解决方法:
方式一:直接设置子视图Frame(简单快捷)
在将子控制器视图添加到容器后,直接把它的frame设置为容器视图的bounds,就能让它完全贴合容器:
override func viewDidLoad() { super.viewDidLoad() containerView = UIView() containerView.frame = CGRect(x: 0 , y: 200 , width: 375, height: 400) self.view.addSubview(containerView) controller = storyboard!.instantiateViewController(withIdentifier: "containerVC") addChildViewController(controller) // 关键:让子控制器视图的frame匹配容器视图的bounds controller.view.frame = containerView.bounds containerView.addSubview(controller.view) controller.didMove(toParentViewController: self) }
方式二:使用Auto Layout约束(推荐适配动态布局)
如果你的容器视图后续可能会改变尺寸(比如横竖屏切换、自适应不同设备),用Auto Layout约束会更灵活,能确保子视图始终贴合容器:
override func viewDidLoad() { super.viewDidLoad() containerView = UIView() containerView.frame = CGRect(x: 0 , y: 200 , width: 375, height: 400) containerView.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(containerView) controller = storyboard!.instantiateViewController(withIdentifier: "containerVC") addChildViewController(controller) controller.view.translatesAutoresizingMaskIntoConstraints = false containerView.addSubview(controller.view) controller.didMove(toParentViewController: self) // 添加约束,让子视图完全覆盖容器视图的四个边缘 NSLayoutConstraint.activate([ controller.view.topAnchor.constraint(equalTo: containerView.topAnchor), controller.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), controller.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), controller.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor) ]) }
另外补充个小知识点:你在Storyboard里设置的Freeform尺寸,只是设计时的预览大小,运行时并不会自动生效——子控制器视图的实际尺寸必须通过代码设置frame或者添加约束来定义,这就是你之前看不到预期效果的核心原因。
内容的提问来源于stack exchange,提问作者209135
相关产品推荐
相关产品推荐

