如何在没有 View Controller 的情况下阻止 UIView 旋转?
Posted
技术标签:
【中文标题】如何在没有 View Controller 的情况下阻止 UIView 旋转?【英文标题】:How to stop UIView from rotating, without View Controller? 【发布时间】:2019-11-23 20:54:22 【问题描述】:我目前正在开发一个电容器插件,因此我对 UIView/Controller 堆栈的控制有些有限。我想要做的是在电容器 webView 下方显示我的插件视图。 Capacitor Plugin 框架提供了一个BridgeViewController
,它控制了一个WKWebView
(Capacitor webView)。 BridgeViewController
也是 rootViewController
,因此 webView
的父级只是没有 View Controller 的 UIView
。
通过执行以下操作,我可以让我的插件显示在 Capacitor webView 下方:
self.bridge.viewController.view.superview?.addSubview(self.myPluginViewController.view)
self.bridge.viewController.view.superview?.bringSubviewToFront(self.webView)
bridge.view
返回 web 视图。然而,问题是self.myPluginViewController
的生命周期方法不再触发。不幸的是,由于bridge
是rootViewController
,bridge.view.superview
没有控制器。
我也试过了:
self.bridge.viewController.addChild(self.myPluginViewController)
self.bridge.viewController.view.superview?.addSubview(self.myPluginViewController.view)
self.bridge.viewController.view.superview?.bringSubviewToFront(self.webView)
但这会引发UIViewControllerHierarchyInconsistency
错误。
关于如何解决这个问题有什么想法吗?是否可以将 myPluginViewController
添加到 bridge
作为 webView 的兄弟姐妹?或者,有没有办法将myPluginViewController.view
直接添加到另一个视图,同时保留生命周期方法?
【问题讨论】:
看看这个swiftbysundell.com/basics/child-view-controllers 我不认为这对我有太大帮助。self.bridge.viewController
中的视图是 WKWebView
,我无法将插件视图添加到其中。我需要让我的插件视图成为该视图的兄弟。不幸的是,self.bridge.viewController
没有任何 ViewController 父级,因为它是根视图。所以我唯一可以访问的父母是UIView
,而不是UIViewController
【参考方案1】:
您所描述的情况听起来并不完全准确。屏幕上的每个视图都有一个父视图和(在树的某处)一个视图控制器。如果您的视图是“根”,则意味着您实际上指的是窗口,或者超级视图是一个窗口。
除此之外,要让视图控制器接收生命周期消息,它需要是窗口的实际根视图控制器的子级。 ios 要求所有应用程序都有一个根视图控制器(我认为从 iOS 7 开始)。这意味着您要么在错误的位置寻找根视图控制器,要么您已经拥有它并且没有意识到它。
获取根视图控制器的一种简单方法是使用UIApplication.shared.keyWindow?.rootViewController
。它已被弃用,但它至少应该可以帮助您找到根视图控制器。一旦您确定了哪个视图控制器实际上是根,您就可以构建一种不被弃用的访问它的方式。我的猜测是你必须让 AppDelegate 参与进来。
【讨论】:
我相信控制webView
的bridge.viewController
是rootViewController
。我放了一个断点,并检查了电容器插件框架给我的桥视图控制器和UIApplication.shared.keyWindow?.rootViewController
,它们具有相同的内存地址。问题似乎是,我不知道如何将兄弟 viewController 添加到 rootViewController/bridgeViewController。
如果它是根视图控制器,那么它不能有兄弟姐妹。
这就是我所害怕的......为了充分了解我正在抓取的内容,rootViewController.view.superview
会指向窗口(也是一个 UIView)?
只要东西没有被篡改,是的,它就是窗口。您可以通过检查它是否为UIWindow
类型来验证这一点。以上是关于如何在没有 View Controller 的情况下阻止 UIView 旋转?的主要内容,如果未能解决你的问题,请参考以下文章
MVC模式:Massive View Controller?
有啥好主意吗? Codeigniter 4,如何制作:View上没有请求,只有Controller上?
如何在没有导航栏的 View Controller 内使用 Nav 推送 UIViewController