【问题标题】:Add UIView Above All Other Views, Including StatusBar在所有其他视图之上添加 UIView,包括 StatusBar
【发布时间】:2010-04-19 11:00:52
【问题描述】:

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

UIActionSheet 和 UIAlertView 都设法在所有其他视图的顶部添加一个黑色半透明视图以阻止输入,我想做类似的事情。

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

我的下一个尝试是扩展 UIAlertView,删除其所有子视图并设置其 layer.contents = nil,然后将 ActivityIndi​​cator 添加为子视图。这很好用,但是当您将 UIAlertView 调用为“显示”时,我似乎无法终止它的默认弹性过渡。

有没有人指出解决这个问题的最佳方法,让我可以完全控制?

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

【问题讨论】:

  • 为什么要“覆盖”状态栏?为什么不隐藏它,让它是半透明的,或者完全忽略它?如果我没记错的话,状态栏对触摸没有反应。
  • 我希望它看起来像在覆盖视图下。这使用户清楚地知道他们当前无法交互。不幸的是,使其半透明并不能实现这一点,如果只是在身份验证期间隐藏它会看起来很奇怪。它确实对触摸有反应。默认是将活动的 UIScrollView 滚动到顶部。

标签: iphone objective-c cocoa-touch


【解决方案1】:

我对 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 的 windows 数组中删除。如果有错误请告诉我。

更新:

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

[primaryWindow makeKeyWindow];

【讨论】:

  • 此代码在 iOS 4.2 中对我不起作用。将出现状态窗口,但不会出现在操作系统提供的默认状态栏上。有小费吗?从 iOS 4.2 开始,这仍然适用于您吗?
  • 它可以工作,但是当我呈现一个动画的 viewController 时,我的这个窗口,它有一个活动指示器在呈现的 viewController 后面,有什么解决方案吗?
  • 当我尝试将界面旋转到横向时失败。statusWindow 只是坚持原点状态栏位置。
  • 需要注意的是,对于 ARC UIWindow,*statusWindow 不能是实例变量,否则它将立即被释放 - 这意味着它永远不会出现。
  • 键盘在屏幕上时不起作用。窗口出现在键盘下方。
【解决方案2】:

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

以下代码对我有用:

我将我的视图作为子视图添加到我的关键窗口中,它会自动将我的视图显示在所有其他视图之上。就我而言,此代码在应用程序的委托中

[self.window addSubview:topViewController.view]

当我完成视图后,以下代码会将其从窗口中删除。

[topViewController.view removeFromSuperview];

【讨论】:

  • 这不会覆盖状态栏
  • 在横向应用程序中以某种方式添加了纵向视图,这看起来很傻。
【解决方案3】:

我即将做同样的事情,发现以下

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

看起来它有你要找的一切

【讨论】:

  • 感谢您的链接,但这并没有涵盖我所看到的状态栏。我想要一个覆盖整个 UI 区域的半透明视图。
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2018-08-18
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多