将UIView添加到所有其他视图之上,包括StatusBar

Mik*_*ead 28 iphone cocoa-touch objective-c

我想创建一个视图(UIControl)来阻止所有输入,并在验证用户时显示UIActivityIndi​​catorView.

UIActionSheet和U​​IAlertView都设法在所有其他视图的顶部添加黑色半透明视图来阻止输入,我想做类似的事情.

我已经尝试将我的视图添加到[[UIApplication sharedApplication] windows]数组中的顶部UIWindow,虽然它确实将它放在UIKeyboard上方(如果它可见),但它不会将它放在StatusBar上(这是有道理的).

我的下一次尝试是扩展UIAlertView,删除其所有子视图并设置其layer.contents = nil,然后将ActivityIndi​​cator添加为子视图.这很好用,但是当你把它称为"show"时,我似乎无法杀死UIAlertView的默认弹跳过渡.

有没有人有任何指针解决这个问题的最佳方法,让我完全控制?

哦,我知道阻塞输入不是很好,但我确保它在短时间内完成并且它的好处是让用户清楚地知道他们必须完成的动作正在处理.

Mik*_*ead 52

我已经对API进行了更多的挖掘,并相信我已经解决了这个问题.

要在整个屏幕上显示视图,您需要创建自己的UIWindow并将其windowLevel属性设置为UIWindowLevelStatusBar.然后,您可以将自定义子视图添加到此窗口.

请注意,Apple不鼓励,但也不禁止创建多个窗口.

UIWindow *statusWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
statusWindow.windowLevel = UIWindowLevelStatusBar;
statusWindow.hidden = NO;
statusWindow.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.7];
[statusWindow makeKeyAndVisible];
Run Code Online (Sandbox Code Playgroud)

当您想要从屏幕上删除窗口时,它看起来就像是从内存中释放它.

[statusWindow release];
Run Code Online (Sandbox Code Playgroud)

这不觉得完全安全,但我没有得到任何错误,它似乎从UIApplication的Windows数组中删除它.如果这是错误的,请告诉我.

更新:

我遇到的另一个问题是UIStatusBar在我显示并删除了这个叠加窗口后没有采取触摸事件将活动的UIScrollView滚动到顶部.解决方案是在释放叠加层后将主窗口设置回关键窗口.

[primaryWindow makeKeyWindow];
Run Code Online (Sandbox Code Playgroud)

  • 此代码在iOS 4.2中不适用于我.将显示状态窗口,但不会显示操作系统提供的默认状态栏.有小费吗?从iOS 4.2开始,这仍然适用于您吗? (2认同)
  • 需要注意的是,使用ARC UIWindow*statusWindow不能是实例变量,否则它将立即释放 - 这意味着它永远不会出现. (2认同)

Vis*_*hry 5

我需要在主窗口中的所有其他视图之上呈现视图.最初,我想在我的关键窗口顶部显示另一个窗口.既然,苹果不鼓励使用多个窗口,我决定反对它.

以下代码为我做了诀窍:

我将我的视图作为子视图添加到我的关键窗口,该窗口自动在所有其他视图之上显示我的视图.在我的情况下,此代码在应用程序的委托中

[self.window addSubview:topViewController.view]
Run Code Online (Sandbox Code Playgroud)

当我完成视图时,以下代码将其从窗口中删除.

[topViewController.view removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)

  • 这不会涵盖状态栏 (3认同)