Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将UIView添加到所有其他视图之上,包括状态栏_Iphone_Objective C_Cocoa Touch - Fatal编程技术网

Iphone 将UIView添加到所有其他视图之上,包括状态栏

Iphone 将UIView添加到所有其他视图之上,包括状态栏,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我想创建一个视图(UIControl),它阻止所有输入并在验证用户时显示UIActivityIndicatorView UIActionSheet和UIAlertView都在所有其他视图的顶部添加了一个黑色半透明视图来阻止输入,我也希望这样做 我已经尝试将我的视图添加到[[UIApplication sharedApplication]windows]数组中的顶部UIWindow中,虽然这会将其放置在UIKeyboard上方(如果可见),但不会将其放置在状态栏上(这是有意义的) 我的下一次尝试是

我想创建一个视图(UIControl),它阻止所有输入并在验证用户时显示UIActivityIndicatorView

UIActionSheet和UIAlertView都在所有其他视图的顶部添加了一个黑色半透明视图来阻止输入,我也希望这样做

我已经尝试将我的视图添加到[[UIApplication sharedApplication]windows]数组中的顶部UIWindow中,虽然这会将其放置在UIKeyboard上方(如果可见),但不会将其放置在状态栏上(这是有意义的)

我的下一次尝试是扩展UIAlertView,删除它的所有子视图,并将其layer.contents设置为nil,然后将ActivityIndicator添加为子视图。这很好,但当您将UIAlertView调用为“show”时,我似乎无法消除它的默认弹性转换

有没有人能告诉我解决这个问题的最佳方法,让我完全掌控局面


哦,我知道阻止输入不是件好事,但我确实确保这是一段短时间的输入,它的好处是让用户清楚地知道,他们的操作(必须完成才能继续)正在处理中。

我很快就会做同样的事情,并发现以下内容


看起来它有你想要的一切

我对API做了更多的挖掘,相信我已经解决了

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

请注意,苹果不鼓励,但也不禁止创建多个窗口。

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的windows阵列中删除了它。如果这是错误的,请告诉我

更新:

我遇到的另一个问题是,在我显示并删除此覆盖窗口后,UIStatusBar没有使用触摸事件将活动的UIScrollView滚动到顶部。解决方案是一旦覆盖被释放,就将主窗口设置回关键窗口

[primaryWindow makeKeyWindow];

我需要在主窗口中的所有其他视图之上显示一个视图。最初,我想在我的关键窗口顶部显示另一个窗口。由于苹果不鼓励使用多个窗口,我决定不使用

以下代码为我实现了这一点:

我将我的视图作为子视图添加到我的关键点窗口,该窗口将自动在所有其他视图的顶部显示我的视图。在我的例子中,此代码位于应用程序的委托中

[self.window addSubview:topViewController.view]
当我处理完视图后,下面的代码将其从窗口中删除

[topViewController.view removeFromSuperview];

谢谢你的链接,但这并没有涵盖我所看到的状态栏。我想要一个半透明的视图,它将覆盖整个UI区域。为什么要“覆盖”状态栏?为什么不隐藏它,让它是半透明的,或者干脆完全忽略它?如果我没记错的话,状态栏对触摸没有反应。我希望它看起来像是在覆盖视图下。这向用户表明,他们当前无法交互。不幸的是,使其半透明并不能实现这一点,而仅在身份验证期间隐藏它看起来会很奇怪。它确实对触摸有反应。默认情况下,将active UIScrollView滚动到顶部。此代码在iOS 4.2中不适用于我。状态窗口将出现,但不会出现在操作系统提供的默认状态栏上。有什么建议吗?从iOS 4.2开始,这仍然适用于您吗?它可以工作,但当我呈现一个viewController动画时,我的this窗口(带有活动指示器)会在呈现的viewController后面,这个问题有什么解决方案吗?当我尝试将界面旋转到横向时,此操作失败。statusWindow仅停留在原点状态栏位置。需要注意的是,使用ARC UIWindow*statusWindow时,statusWindow不能成为实例变量,否则它将立即释放-这意味着它将永远不会显示。它不起作用当键盘在屏幕上时。窗口显示在键盘下方。这不会覆盖横向应用程序中的状态栏。这会在纵向视图中添加视图,这看起来非常愚蠢。