2010-04-19 71 views
27

我想创建一个视图(UIControl),它阻止所有输入并在验证用户时显示UIActivityIndi​​catorView。添加UIView以上所有其他视图,包括状态栏

UIActionSheet和U​​IAlertView都管理添加一个黑色的半透明的视图顶部的所有其他视图来阻止输入,我想做类似的事情。我已经尝试在[[UIApplication sharedApplication]窗口]数组中添加我的视图到顶层的UIWindow,虽然这确实将它放在UIKeyboard的上方(如果它是可见的),但它不会将它放在StatusBar上说得通)。

我的下一个尝试是扩展UIAlertView,删除它的所有子视图并设置其layer.contents = nil,然后将ActivityIndi​​cator添加为子视图。这个效果很好,但是当你把它叫做“show”时,我似乎无法杀掉UIAlertView的默认弹性转换。

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

哦,我知道阻塞输入并不是很好,但我确实确保它很短的时间,它的好处是让用户明白他们的动作必须完成以便进行处理。

+2

为什么“隐藏”状态栏?为什么不把它藏起来,是半透明的,还是完全忽略它?如果我记得正确,状态栏不响应触摸。 – 2010-04-19 14:29:06

+5

我希望它看起来像是在重叠视图下。这使用户清楚他们目前无法互动。不幸的是,让它变成半透明的,隐藏起来看起来很奇怪,如果只是在认证期间。 它确实响应触摸。默认是将活动的UIScrollView滚动到顶部。 – 2010-04-19 22:16:18

回答

51

我做了一些周围的多个挖掘一切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]; 

当你想从它看起来好像你从内存中释放它的屏幕删除窗口。

[statusWindow release]; 

这并不感到完全安全的,但我没有得到任何错误,它似乎砸出来的UIApplication的窗口阵列。请让我知道如果这是错误的。

更新:

一个我碰到是UIStatusBar没有采取触摸事件到活动的UIScrollView滚动到顶部我已经显示和删除此叠加窗口之后,另一个问题。解决方案是在覆盖层发布后将主窗口设置回关键窗口。

[primaryWindow makeKeyWindow]; 
+2

此代码在iOS 4.2中不适用于我。状态窗口将出现,但不会超出OS提供的默认状态栏。有小费吗?从iOS 4.2起,这对你仍然有用吗? – jbrennan 2010-12-02 00:55:39

+0

它的工作原理,但当我提出一个viewController动画,我的这个窗口,其中有一个活动指标落后所呈现的viewController,任何解决这个问题? – 2012-01-17 15:00:30

+1

当我尝试将界面旋转到横向时,此失败。statusWindow只是坚持原点状态栏的位置。 – 2012-02-21 09:20:41

1

我即将做同样的事情不久,发现如下

http://www.dejal.com/developer/dsactivityview

看起来有你要找的

+0

感谢您的链接,但这并不包含我所能看到的状态栏。我在半透明视图之后会覆盖整个区域的用户界面。 – 2010-04-19 12:28:53

5

我需要我的主窗口内就所有其他视图顶部视图。最初,我想在我的关键窗口之上展示另一个窗口。因为,苹果劝阻使用多个窗口,我决定反对它。

下面的代码的伎俩对我来说:

我说我的观点作为副视点我的重要窗口自动展示我对所有其他视图顶视图。在我的情况下,该代码是在应用程序的委托

[self.window addSubview:topViewController.view] 

,当我的观点做,下面的代码从窗口中删除。

[topViewController.view removeFromSuperview]; 
+2

这不会覆盖状态栏 – OpenThread 2013-08-11 13:03:15

+0

不知何故在景观应用程序中,这增加了肖像视图,这看起来很愚蠢。 – Dvole 2014-02-02 13:26:33

相关问题