在子视图中显示视图控制器
Posted
技术标签:
【中文标题】在子视图中显示视图控制器【英文标题】:Show view controller in a subview 【发布时间】:2019-01-04 15:37:49 【问题描述】:是否可以向 UIView 显示/添加视图控制器?如果是的话,有人可以在我尝试时提供帮助,但我无法弄清楚。下面是我正在使用的当前代码。提前致谢
if let keyWindow = UIApplication.shared.keyWindow
//container view
let containerFrame = CGRect(x: 0, y: keyWindow.frame.height, width: keyWindow.frame.width, height: 5)
likesContainerView = UIView(frame: containerFrame)
likesContainerView?.backgroundColor = UIColor.red
keyWindow.addSubview(likesContainerView!)
//likes view controller
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "likesVC") as! likeViewController
vc.view.frame = (likesContainerView?.frame)!
self.addChildViewController(vc)
likesContainerView?.addSubview(vc.view) //crashes here!!
vc.didMove(toParentViewController: self)
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations:
likesContainerView?.frame = CGRect(x: 0, y:10, width: keyWindow.frame.width, height:500)
) (_) in
【问题讨论】:
顺便说一句,如果你真的在做视图控制器包含并且要为likesContainerView
设置动画,你真的应该在动画的完成处理程序中做didMove
...
【参考方案1】:
当您执行视图控制器包含(addChild
、addSubview
、didMove
)时,整个想法是将其添加为现有视图控制器中视图的子视图。这些调用的目的是确保您的视图层次结构与您的视图控制器层次结构保持同步。
但是您将 vc.view
添加为 likesContainerView
的子视图,您已将其添加为 keyWindow
的子视图。整个想法是视图控制器的视图可以具有由另一个视图控制器管理的子视图。
您的self
显然引用了一个视图控制器,因此如果您正在执行视图控制器包含,您应该将vc.view
添加为当前view
的subview
,而不是直接添加到keyWindow
。
【讨论】:
好的,谢谢 Rob 的解释。那么你的意思是不可能在 keyWindow 内将视图控制器添加到 UIView 对吗? 我在做一个狭义的断言,即如果你不做视图控制器的遏制,你不应该做视图遏制调用(即addChild
,didMove
)。如果您进行遏制,请将其添加为视图控制器视图的子视图。如果你真的必须搞砸keyWindow
,不要使用视图控制器包含。以上是关于在子视图中显示视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
在父视图控制器上注册一个 Segue 以在子视图控制器上使用
iPhone UIView:是不是可以仅在子视图上启用用户交互?