Interface Builder容器视图Embed Segue作用?代码嵌入布局异常求助
解决代码嵌入ViewController时布局超出容器的问题
嘿,我懂你遇到的这个困扰——用代码手动嵌入子ViewController时,子视图总是超出容器底部导致布局混乱,但通过Storyboard的Embed Segue添加就完全正常,对吧?
问题根源
你的代码里漏掉了一个至关重要的步骤:必须将子ViewController的view的translatesAutoresizingMaskIntoConstraints属性设置为false。
默认情况下,UIViewController的view的translatesAutoresizingMaskIntoConstraints是true,系统会自动为它生成一套基于frame的自动约束。当你手动添加四个边对齐容器的约束时,这两套约束就会产生冲突,最终导致布局计算异常,出现子视图超出容器底部的情况。而Storyboard中的Embed Segue在创建并嵌入子VC时,会自动帮你把这个属性设为false,所以不会有约束冲突的问题。
修正后的代码
let viewController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "MyViewController") // 关键:关闭自动约束转换,避免和手动添加的约束冲突 viewController.view.translatesAutoresizingMaskIntoConstraints = false self.containerView.addSubview(viewController.view) self.addChildViewController(viewController) NSLayoutConstraint.activate([ viewController.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), viewController.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), viewController.view.topAnchor.constraint(equalTo: containerView.topAnchor), viewController.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor) ]) viewController.didMove(toParentViewController: self)
额外优化(iOS 13+)
如果你适配的是iOS 13及以上版本,可以使用更新的API简化子VC的添加流程:
let viewController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "MyViewController") viewController.view.translatesAutoresizingMaskIntoConstraints = false self.containerView.addSubview(viewController.view) self.addChild(viewController) // 替代addChildViewController NSLayoutConstraint.activate([ viewController.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), viewController.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), viewController.view.topAnchor.constraint(equalTo: containerView.topAnchor), viewController.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor) ]) viewController.didMove(toParent: self) // 替代didMove(toParentViewController:)
内容的提问来源于stack exchange,提问作者Stephan Boner
相关产品推荐
相关产品推荐

