如何在iOS 9上淡入/淡出navigationBar?

点击图像时,内置照片应用程序会淡入/淡出navigationBar。 这种方式照片应用程序允许全屏查看。

它是如何做到的(淡化效果)?

据我了解navigationController?.navigationBar.alpha不再起作用(所以你不能用这种方式设置它的动画)。

分享我的所有发现。

投诉模式开启

坦率地说,我感到有点生气/像个假人,我不得不为实现Apple应用程序中存在的简单事物而度过美好的一天。

投诉模式关闭

首先,这里是一些背景。 我正在使用由navigationController提供的navigationBar(vs只是在视图中手动删除的独立栏)

我找到了几种方法。 我会提到所有这些(即使我没有成功使用它们)

1)使用navigationBar的alpha变化动画

 UIView.animateWithDuration(0.1, animations: { navigationController?.navigationBar.alpha = 0 }, completion: nil) 

@rmaddy在这里提到它对他有用。 但是,我相信他有一个独立的栏(与由navigationController管理的栏)。

我使用Reveal工具检查UI层次结构并发现了几件事。 – 有一个隐藏的navigationBar(和navigationController?.navigationBar正在引用它)。 所以你可以改变你的心灵快乐,但这些变化是不可见的。

然而,还有另一个导航栏。 我假设它在navigationController的一些私有成员中引用(让我们称之为私有navigationBar)。 它是可见的,这是在视图顶部显示的内容。

2)使用setNavigationBarHidden:animated:

这是隐藏/显示导航栏的标准方法。 它是动画的不同方式(它滑动/上下)。 但是,如果它对你没问题,那么就这样,因为它简单而干净。

 navigationController?.setNavigationBarHidden(true, animated: true) 

此外,您可以将其包装在UIView.beginAnimations,UIView.commitAnimations中,以便与其他一些东西一起制作动画(使其更流畅)

3)私人导航栏的alpha变化动画。

这对我有用:

  let privateNavigationBar = self.superview?.superview?.superview?.superview?.superview?.superview?.subviews[1] UIView.animateWithDuration(0.1, animations: { privateNavigationBar.alpha = 0 }, completion: nil) 

我将通过层次结构获取包含私有navigationBar(该视图的第二个子视图)的视图。

但是,这种方法有许多缺点:

  • 我相信超级视图? 取决于您的应用层次结构(与您使用拆分视图等)。 我认为你可以概括或者可能只是UINavigationBar整个层次结构来找到非隐藏的UINavigationBar来解决这个问题。
  • 我有一种感觉,苹果可能会对此不满(你的应用程序不被AppStore接受)

4)使navigationBar透明并将背景图像设置为透明并更改其上的alpha通道。

我找不到我读到这个想法的地方。 有几个提到。

Apple示例应用程序显示了如何自定义NavigationBar,包括使其透明。

有趣的是,这个示例应用程序适用于我(导航栏是透明的)。 但是,当我在我的应用程序中尝试此代码时,它不起作用(我仍然没有弄清楚这是怎么回事)。 像往常一样有很多变量(可能是Info.plist中的东西,也是它们子类的NavigationController,也可能是视图层次结构中的东西)

5)添加独立的navigationBar

您可以隐藏由navigationController提供的栏。 将自己添加到UIView,将其连接到@IBOutlet并在其上使用alpha动画(很可能是@rmaddy所指的)。

我检查了,这是工作。

本教程中使用了此方法。

但是,它有一个缺点:

  • 我相信它不会处理好旋转,在通话或GPS时增加状态栏高度

每次当我看到这样的代码(写在文章中)时,我知道resize会有问题: CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 64.0)

您可以使用约束替换它。 我走了这条路,但偶然发现了一些问题。

6)其他方法

我看到了另外两种方法。 我不知道它们是否有用或有什么缺点:

其中一个在这个问题: 如何通过淡入/淡出同时隐藏/显示状态栏和导航栏,如iOS 7中的照片应用程序?

这个答案: https : //stackoverflow.com/a/18063898/422080