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

时间:2016-04-24 04:44:25

标签: ios uinavigationbar ios9

当您点按图像时,内置照片应用程序会淡入/淡出navigationBar。通过这种方式,Photo应用程序可以全屏查看。

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

据我所知,navigationController?.navigationBar.alpha已不再适用(因此您无法以此方式制作动画)。

1 个答案:

答案 0 :(得分:11)

分享我的所有发现。

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

关闭投诉模式

首先,这里有一些背景。我正在使用由navigationController提供的navigationBar(与在视图中手动删除的独立条形图相比)

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

1)修改navigationBar的alpha变化

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

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

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

然而还有另一个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来解决这个问题。
  • 我有一种感觉,苹果可能会对此感到不满(你的应用程序不被AppStore接受)

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

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

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

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

5)添加独立的navigationBar

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

我检查过,这是有效的。

此方法用于this教程。

然而,它有一个缺点:

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

每次当我看到这样的代码(写在文章中)时,我都知道调整大小会有问题: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?

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