如何在iOS 9上实现导航栏的淡入/淡出效果?

12

内置的照片应用程序在您点击图像时淡入/淡出navigationBar。这样,照片应用程序允许您查看全屏幕。

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

据我所知,navigationController?.navigationBar.alpha 不再起作用(因此您无法以这种方式对其进行动画处理)。


UINavigationController setNavigationBarHidden:animated: 方法怎么样? - rmaddy
顺便说一句 - 我有一个应用程序,可以使 navigationBaralpha 属性动画化,并且它完美地工作。不确定为什么你说它不再起作用了。试试看吧。 - rmaddy
@rmaddy 它显示和隐藏导航栏。但是,它使用不同的动画。它将其向上和向下滑动(而不是淡入淡出)。 - Victor Ronin
@rmaddy. 关于alpha属性。我刚刚创建了一个新项目(主细节项目)。我向DetailViewController添加了以下代码。我运行该项目并打开详细视图,但是我没有看到导航栏发生任何变化。我检查了代码是否被调用。您的导航栏是否有任何特殊要求?请在新的(干净的)项目上尝试。我添加的代码是“override func viewDidAppear(animated:Bool){ UIView.animateWithDuration(1.0,animations:{ self.navigationController?.navigationBar.alpha = 0 },completion:nil) }” - Victor Ronin
1个回答

19

分享我所有的发现。

抱怨模式开启

坦白地说,我感觉很恼火/很傻,因为我不得不花费一整天的时间来实现一个在苹果应用程序中存在的简单功能。

抱怨模式关闭

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

这里有几种方法,我将提到它们所有的方法(即使我没有成功地使用它们)

1)动画更改navigationBar的alpha值

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

@rmaddy提到它对他有效。但是我相信他有一个独立的导航栏 (而不是由navigationController管理的导航栏)。

我使用了一个工具Reveal来检查UI层次结构并发现了一些问题。 - 有一个隐藏的navigationBar,而navigationController?.navigationBar在引用它。所以你可以尽情改变alpha值,但这些更改不会显示出来。

然而还有另一个navigationBar。我假设它在navigationController的某些私有成员中被引用了(我们称之为private 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(该navigationBar是该视图的第二个子视图)。

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

  • 我认为# of superviews?取决于您的应用程序层次结构(与您是否使用拆分视图等)。我认为您可以概括或者只需遍历整个层次结构以查找非隐藏的UINavigationBar来解决此问题。
  • 我感觉苹果可能会对此提出反对意见(您的应用程序可能不会被接受到AppStore)

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

我找不到我读过这个想法的地方。提到了几次。

有一个Apple示例应用程序展示了如何自定义NavigationBar,包括使它透明。

有趣的是,这个示例应用程序对我有效(其中的导航栏是透明的)。然而,当我在我的应用程序中尝试此代码时,它无效(我仍然没有弄清楚发生了什么)。与通常情况下一样,有一堆变量(可能是Info.plist中的某些内容,也可能是它们的子类NavigationController中的某些内容,还可能是视图层次结构中的某些内容)

5)添加独立的navigationBar

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

我检查过了,这行得通。

此方法在教程中使用。

但是,它也有缺点:

  • 我认为它无法很好地处理旋转、呼叫或GPS时状态栏高度的增加

每当我看到像文章中写的那样的代码时,我就知道会出现调整大小的问题:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 64.0)

您可以用约束替换它。我走了这条路,但遇到了一些问题。

6)其他方法

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

其中之一在这个问题中:如何像iOS 7中的相册应用程序一样同时淡入/淡出隐藏/显示状态栏和导航栏?

和这个答案:https://dev59.com/y2Mm5IYBdhLWcg3wDbmo#18063898


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接