如何在 iOS 9 上淡化 in/out 导航栏?

How to fade in/out navigationBar on iOS 9?

当您点击图像时,内置照片应用程序会淡化 in/out 导航栏。这样照片应用程序就可以全屏查看了。

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

据我所知,navigationController?.navigationBar.alpha 不再有效(所以你不能用这种方式制作动画)。

分享我的所有发现。

投诉模式开启

坦率地说,我觉得有一半 pissed/like 是个傻瓜,我不得不为实现 Apple 应用程序中存在的简单功能而奋斗。

关闭投诉模式

首先是一些上下文。我正在使用 navigationController 提供的 navigationBar(相对于手动放置在您视图中的独立栏)

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

1) 动画改变 navigationBar 的 alpha

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

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

我使用工具 Reveal 检查 UI 层次结构并发现了一些东西。 - 有一个隐藏的导航栏(navigationController?.navigationBar 正在引用它)。所以你可以改变 alpha 到你心中的喜悦,但这些变化不会是可见的。

但是还有另一个 navigationBar 。我假设它在 navigationController 的一些私有成员中被引用(我们称它为私有 navigationBar)。它是可见的,这就是显示在您视图顶部的内容。

2) 使用setNavigationBarHidden:animated:

这是 hide/show 导航栏的标准方式。它的动画方式不同(slides/up 及以下)。但是,如果你觉得合适,就选择这个吧,因为它简单干净。

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)

我将向上遍历层次结构以获得包含私有导航栏的视图(这是该视图的第二个子视图)。

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

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

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

我找不到我在哪里读到过这个想法。有几个提到。

Apple example app 展示了如何自定义 NavigationBar,包括使其透明。

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

5) 添加独立的导航栏

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

我检查了一下,这是工作。

此方法在 this 教程中使用。

但是,它有一个缺点:

  • 我认为它不能很好地处理旋转、通话或 GPS 时状态栏高度的增加

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

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

6) 其他方法

我又看到了两个方法。我不知道它们是否有效或有什么缺点:

本题其中一位:How to hide/show status bar and navigation bar by fading in/out at the same time like the Photos app in iOS 7?

这个答案: