【问题标题】:How do I add a dark screen that covers all other views (including navigation bar and status bar)?如何添加覆盖所有其他视图(包括导航栏和状态栏)的暗屏?
【发布时间】:2013-11-04 21:25:52
【问题描述】:

我想在我的所有视图上添加一个黑屏,然后在其上方显示一个通知窗口,就像在 Tweetbot 3 中一样:

但是,我不完全确定这是如何实现的。

添加一个以屏幕大小为框架的暗视图不起作用,如下:(导航栏和状态栏没有被覆盖)

UIView *darkOverlay = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
darkOverlay.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];
[self.view insertSubview:darkOverlay behindSubview:self.view];

这涵盖了除了状态栏之外的所有内容(所以它非常接近,但由于我的状态栏内容很轻,它仍然非常刺耳):

[[[UIApplication sharedApplication] keyWindow] addSubview:darkOverlay];

那么这样的事情是如何完成的呢?

【问题讨论】:

  • 你好像已经问过这个问题了:How do I fade/dim the background of my app while keeping a few in the front normal?请不要转发。
  • 这是一个不同的问题。那里的答案满足了我的需要,但我现在意识到视图可能会有一个导航栏,所以需求是不同的。
  • 重读后也看不出区别。
  • 能够在导航栏上添加视图与回答者和接受者的解释截然不同。这些解决方案有效,但不适用于需要覆盖导航栏的情况。
  • 如果你被误解了,你可以编辑你之前的问题,如果它不能真正解决你的问题,你不必接受。

标签: ios objective-c uiview ios7


【解决方案1】:

你可以试试这个方法

    UIWindow* window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    window.windowLevel = UIWindowLevelAlert;
    window.opaque = NO;

    [window addSubview:someView];

    // window has to be un-hidden on the main thread
    [window makeKeyAndVisible];

“视图”在哪里 - 是您的自定义弹出窗口。

【讨论】:

    【解决方案2】:

    你必须这样做:

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    _darkCoverView = [[UIView alloc] initWithFrame:screenRect];
    _darkCoverView.backgroundColor = [UIColor blackColor];
    _darkCoverView.alpha = 0.5;
    
    [[[[UIApplication sharedApplication] delegate] window] addSubview:_darkCoverView];
    

    它对我有用,状态栏也被覆盖了:)

    【讨论】:

      【解决方案3】:

      您可以尝试简单地以模态方式呈现它,因为模态视图控制器位于导航控制器之上。

      TransparancyViewController *vc=[[TransparancyViewController alloc]initWithNibName:@"TransparancyViewController" bundle:nil] ;
      vc.view.backgroundColor = [UIColor clearColor];
      navController.view.alpha = 0.3;
      navController.modalPresentationStyle = UIModalPresentationCurrentContext;
      [navController presentViewController:vc animated:NO completion:nil];
      

      用于情节提要的小示例项目..http://cl.ly/442C11341k2G

      【讨论】:

      • 虽然这可行,但我使用它的方式有点类似于 Tweetbot 在上面的屏幕截图中所做的,所以随机消失的导航栏看起来很奇怪。
      • 如何以模态方式呈现它们?模态视图位于导航栏上方
      • 在上面的代码中,透明笔尖只有你想要显示的“警报视图”
      • 可以不用笔尖吗?我在这个项目中做错了什么? cl.ly/3f2Y0P3j1x0C 我想如果你能包含一个小示例项目,那就太好了。
      • 你项目中的navigationController是nil,因为你没有在storyboard中初始化一个。
      【解决方案4】:

      当您创建 darkOverlayView 时,最好指定视图的实际边界,它应该填满整个屏幕(使用 iPhone 5 的宽度、高度)。

      UIView *darkOverlay = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320, 568)];
      

      如果你的通知对象也是一个 UIView,把它放在前面。

      [self.view addSubView:darkOvelay]
      [self.view bringSubviewToFront:notificationView];
      

      我希望这能解决你的问题,干杯,吉姆。

      【讨论】:

      • 我确实使用了正在使用的设备的边界,这就是[UIScreen mainScreen] 部分的作用。而且这个解决方案并没有覆盖所有的子视图,它只是在 View Controller 的视图中添加了一个更暗的视图。
      • 对不起,它从来没有奏效。您是否只需要在背景中添加一个填充整个屏幕的较暗视图(例如 UIAlertview 会发生什么?)。如果是这样,我通常会创建一个单独的 xib 和 class 文件来使用。祝你好运。
      • 那也覆盖了状态栏?
      • 是的,如果您正确设置背景颜色(alphas),并将其配置为隐藏状态栏,它应该可以工作。在下面查看我经过审核的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多