如何在没有 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 的生命周期方法不再触发。不幸的是,由于bridgerootViewControllerbridge.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 参与进来。

【讨论】:

我相信控制webViewbridge.viewControllerrootViewController。我放了一个断点,并检查了电容器插件框架给我的桥视图控制器和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

在 View Controller 完成时传回多个变量

如何在 iOS 上正确使用 Container View Controller

如何以编程方式调用View Controller?