在所有视图之上添加一个UIView,甚至是导航栏。

6 浏览
0 Comments

在所有视图之上添加一个UIView,甚至是导航栏。

我想要在其他视图之上显示一个类似于“弹出”视图,即使是导航栏,它看起来像这样:

  • 全屏黑色背景,透明度为0.5,可以看到下方的其他UIViewController
  • 中间有一个UIView窗口,显示一些信息(如果你想知道所有的事情,可以是一个日历)。

为此,我创建了一个包含这两个UIViews(背景和窗口)的UIViewController,并试图显示它。我尝试了简单的[mySuperVC addSubview:myPopUpVC.view],但导航栏仍然在上面。

我试图以模态方式呈现它,但是下面的UIViewController消失了,我失去了透明效果。

有什么好的想法吗?我相信这很简单...

谢谢!

0
0 Comments

问题的原因是希望将一个UIView添加到所有其他元素之上,即使是导航栏。然而,尝试使用zPosition属性将导航栏放置在添加的视图之下时,可能会导致一些问题,如导航栏变得不可见或导航栏按钮无法正常工作。

解决这个问题的方法是在添加视图之前,将导航栏的zPosition属性设置为一个较高的负值,例如-1,以确保添加的视图位于导航栏之上。使用以下代码实现:

self.navigationController?.navigationBar.layer.zPosition = -1

需要注意的是,在完成添加视图操作后,应将导航栏的zPosition属性设置回0,以便将其恢复到正常的层级。使用以下代码实现:

self.navigationController?.navigationBar.layer.zPosition = 0

对于同时存在TabBar的情况,设置导航栏的zPosition属性可能不起作用。此时,可以尝试使用isHidden属性来控制TabBar的可见性,而不是使用zPosition属性。

需要注意的是,使用zPosition属性可能会影响可访问性,因为拖动视图可能无法正确获取焦点。因此,在考虑使用这种方法时,需要权衡可访问性和视觉效果之间的权衡。

此外,如果添加的视图是一个UIImageView,并且在该视图上进行了缩放操作,可能会导致导航栏按钮无法正常工作。这是因为zPosition属性可能会影响事件传递的顺序。在这种情况下,可能需要考虑其他方法来实现所需的效果。

总之,通过设置导航栏的zPosition属性,可以将一个UIView添加到所有其他元素之上,即使是导航栏。但是,需要注意可能会出现的一些问题,并根据具体情况选择合适的解决方法。

0
0 Comments

问题出现的原因是在导航栏上方添加一个UIView,即使导航栏也在其中。解决方法是使用[self.navigationController.view addSubview:overlayView];,需要设置frame,并且不能在子视图控制器的视图上使用此方法。另外,与将视图添加到键窗口相比,通过更改导航栏的z级别可以实现更优雅的解决方案,因为这样可以确保添加的视图随着基础视图的动画移动。如果将视图添加到键窗口上,则不会带有动画,并且如果要关闭控制器,则需要单独删除该视图。

0
0 Comments

问题出现的原因是需要在所有视图之上添加一个UIView,包括导航栏。解决方法是将该视图直接添加到keyWindow上。如果是在Swift 4.1及以上版本,可以使用以下代码:

let currentWindow: UIWindow? = UIApplication.shared.keyWindow

currentWindow?.addSubview(myView)

如果是在iOS 13及以上版本,可以使用以下代码:

UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.addSubview(myView)

在横屏模式下,可能需要对视图进行旋转,可以参考stackoverflow上的解答。但需要注意的是,该解决方案在iOS 8之前的设备上可能存在方向问题。

如果想要该视图只在特定的视图控制器上显示,可以将该视图添加到导航栏本身。

在某些情况下,该视图可能会在屏幕加载时快速消失。可以尝试将该视图添加到viewDidLoad、viewDidAppear或viewWillAppear中。

此外,该视图可能无法覆盖选项卡栏和状态栏。

0