OStack程序员社区-中国程序员成长平台

标题: iOS:创建另一个 UIWindow 作为覆盖的问题(iOS 7 问题?) [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 23:47
标题: iOS:创建另一个 UIWindow 作为覆盖的问题(iOS 7 问题?)

我想在所有其他 View (包括键盘)之上创建一个覆盖 View ,并且创建另一个 UIWindow 似乎是执行此操作的方法。看完the Windows section of the View Programming Guide还有一些网上的其他文件,看来我只需要……

这是我的应用委托(delegate)中的代码:

self.overlayWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.overlayWindow.backgroundColor = [UIColor clearColor];
self.overlayWindow.windowLevel = UIWindowLevelStatusBar;
self.overlayWindow.userInteractionEnabled = NO;
self.overlayWindow.rootViewController = [[OverlayViewController alloc] initWithNibName:nil bundle:nil];
self.overlayWindow.hidden = NO;

但是,我遇到了一些问题:

  1. [self.overlayWindow.rootViewController preferredStatusBarStyle] 正在设置状态栏文本颜色,而我实际上希望原始窗口的 Root View Controller 执行此操作。
  2. 一个大问题是,额外的窗口以某种方式扰乱了我对软件键盘通知的处理。似乎我仍然收到通知,但在某些情况下我的应用程序响应异常。 (我不会解释这些奇怪的行为是什么,因为它们跑题了。)关键是我根本不应该得到这些奇怪的行为:我只是想在应用程序上绘制一个覆盖层,而应用的行为应该和以前一样。
  3. 我希望 overlayWindow 的旋转与我的原始窗口的旋转相匹配,但它是独立旋转的。例如,UINavigationController 的 swipe-to-go-back 手势锁定了界面方向,但 overlayWindow 在此期间仍然可以旋转。

我应该怎么做才能解决这个问题,这样我才能在应用程序上得到一个无害的覆盖?



Best Answer-推荐答案


我已经完成了与使用窗口非常相似的事情。在我的情况下,我没有使用附加到窗口的 UIViewController,只是需要的 subview ,所以它看起来是正确的。为了正确处理旋转,您可以收听 NSNotification

UIApplicationDidChangeStatusBarOrientationNotification

在方法处理程序中,您可以像调用这样的调用一样获取设备方向

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

然后您可以使用 CGAffineTransformMakeRotation 将窗口内的 View 旋转到正确的方向。从该方法的外观来看,您会认为您会在设备方向动画后收到通知,但是您会在之前收到通知,当您使用变换旋转 View 时,您的旋转将与其他所有内容一起动画(这是假设事情是居中的,如果没有事情更复杂)。如果您想要一个示例 https://github.com/samvermette/SVProgressHUD,SVProgress hud 将是一个很好的学习示例

关于iOS:创建另一个 UIWindow 作为覆盖的问题(iOS 7 问题?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24689847/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4