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

Vic*_*nin 11 uinavigationbar ios ios9

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

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

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

Vic*_*nin 11

分享我的所有发现.

投诉模式开启

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

投诉模式关闭

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

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

1)使用navigationBar的alpha动画更改

UIView.animateWithDuration(0.1, animations: {
   navigationController?.navigationBar.alpha = 0
}, completion: nil)
Run Code Online (Sandbox Code Playgroud)

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

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

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

2)使用setNavigationBarHidden:animated:

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

navigationController?.setNavigationBarHidden(true, animated: true)
Run Code Online (Sandbox Code Playgroud)

此外,您可以将其包装在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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

苹果的示例应用程序展示了如何自定义导航栏,包括使其透明.

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

5)添加独立的navigationBar

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

我检查了,这是工作.

教程使用此方法.

但是,它有一个缺点:

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

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

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

6)其他方法

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

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

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