我想在所有其他 View (包括键盘)之上创建一个覆盖 View ,并且创建另一个 UIWindow 似乎是执行此操作的方法。看完the Windows section of the View Programming Guide还有一些网上的其他文件,看来我只需要……
- 使用屏幕边界创建窗口,
- 将其
windowLevel 设置为UIWindowLevelStatusBar ,
- 将
userInteractionEnabled 设置为 NO (因此它会忽略触摸),
- 并通过将其
hidden 属性设置为 NO 使其可见(不使其成为关键窗口,因此它不会接收非触摸事件)。
这是我的应用委托(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;
但是,我遇到了一些问题:
[self.overlayWindow.rootViewController preferredStatusBarStyle] 正在设置状态栏文本颜色,而我实际上希望原始窗口的 Root View Controller 执行此操作。
- 一个大问题是,额外的窗口以某种方式扰乱了我对软件键盘通知的处理。似乎我仍然收到通知,但在某些情况下我的应用程序响应异常。 (我不会解释这些奇怪的行为是什么,因为它们跑题了。)关键是我根本不应该得到这些奇怪的行为:我只是想在应用程序上绘制一个覆盖层,而应用的行为应该和以前一样。
- 我希望
overlayWindow 的旋转与我的原始窗口的旋转相匹配,但它是独立旋转的。例如,UINavigationController 的 swipe-to-go-back 手势锁定了界面方向,但 overlayWindow 在此期间仍然可以旋转。
我应该怎么做才能解决这个问题,这样我才能在应用程序上得到一个无害的覆盖?
Best Answer-推荐答案 strong>
我已经完成了与使用窗口非常相似的事情。在我的情况下,我没有使用附加到窗口的 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/
|