我想在所有其他 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
在此期间仍然可以旋转。我应该怎么做才能解决这个问题,这样我才能在应用程序上得到一个无害的覆盖?
我已经完成了与使用窗口非常相似的事情。在我的情况下,我没有使用附加到窗口的 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 |