自定义 UIWindow 方向

Posted

技术标签:

【中文标题】自定义 UIWindow 方向【英文标题】:custom UIWindow orientation 【发布时间】:2010-07-28 13:56:36 【问题描述】:

我需要在我的窗口上查看触摸事件,因此我将 UIWindow 子类化为我的 MYWindow 类。我正在重写 sendEvent 函数以接收窗口上的触摸事件,所有这些都工作得很好。我做了以下事情来实现这一点:

self.window = [[MYWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[window makeKeyAndVisible];

我面临的问题是,当我这样做时,此窗口上的视图控制器将不再旋转。如果我要使用常规的 UIWindow,它们都会像我想要的那样工作。显然,我的设置有问题。

我正在查看 UIWindow 头文件,有一个方法叫做

- (void)becomeKeyWindow;  //override point for subclass, Do Not call directly

我是否想在我的自定义 UIWindow 类中实现它,就像我必须实现 sendEvent: 方法一样?请指出我正确的方向。

提前谢谢各位。

【问题讨论】:

【参考方案1】:

我发现了问题所在。我在自定义窗口上创建了一个委托,并将其称为导致问题的“委托”。将其命名为“aDelegate”解决了这个问题。感谢您的所有帮助。

【讨论】:

+1 谢谢,刚刚花了一个多小时调试我的应用程序中的所有内容来解决这个问题,甚至回到使用 XIB 来尝试解决,但这是有效的解决方案。我事先查看了 UIWindow 的继承链,以确保我没有覆盖现有的“委托”属性,但显然错过了一些东西。回想起来,在子类中使用“代表”是一个非常冒险的名称。【参考方案2】:

我只是在这里猜测,但我认为这是因为您现在将 MYWindow 设置为关键窗口(即使它是透明的)并且 shouldAutorotateToInterfaceOrientation:UIViewController 类的一部分,而不是 UIWindow .

因此,即使您可以看到其他视图,它们也不会再调用它们的轮换事件了。

与其将其设为UIWindow 子类,不如在UIView 上实现那些添加到需要处理触摸事件的视图中的触摸事件?你也可以让它透明,并且只在UIViewController级别处理旋转?

【讨论】:

我对 UIWindow 进行子类化的原因是我有一个密码屏幕,如果屏幕上没有检测到任何活动(触摸),它会在一段时间后显示。为此,我对 sendEvent 函数进行了子类化,以检测任何 viewController 上的任何触摸。我不想在我的每一个视图控制器中重复相同的代码。如果我只需要一个 viewController 上的触摸事件,我会这样做的。然而,事实并非如此。其他所有功能都可以正常调用。我进出 viewControllers 没有任何问题。 你看看你是否也可以传递运动事件。 Apple 对此有一些指导,但我从未这样做过,所以我不确定您是否可以传递除加速度计数据之外的任何其他数据,然后您必须自己解释。

以上是关于自定义 UIWindow 方向的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UIwindow 不显示

iOS9:自定义 UIWindow 使状态栏消失

为啥自定义 UIWindow 中的 UILongPressGestureRecognizer 没有反映在应用程序的 UIWebview 中?

iOS9用自定义uiwindow覆盖状态栏 - 位置错误

iOS-Xcode11: 删除默认Main.storyBoard, 自定义UIWindow不能在AppDelegate中处理,新增SceneDelegate代理

“关闭” UIWindow 后,搜索列表上的光标丢失