内置的照片应用程序在您点击图像时淡入/淡出navigationBar。这样,照片应用程序允许您查看全屏幕。
它是如何做到这一点(淡入效果)的呢?
据我所知,navigationController?.navigationBar.alpha
不再起作用(因此您无法以这种方式对其进行动画处理)。
内置的照片应用程序在您点击图像时淡入/淡出navigationBar。这样,照片应用程序允许您查看全屏幕。
它是如何做到这一点(淡入效果)的呢?
据我所知,navigationController?.navigationBar.alpha
不再起作用(因此您无法以这种方式对其进行动画处理)。
分享我所有的发现。
抱怨模式开启
坦白地说,我感觉很恼火/很傻,因为我不得不花费一整天的时间来实现一个在苹果应用程序中存在的简单功能。
抱怨模式关闭
首先,这里有一些背景。我正在使用由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是该视图的第二个子视图)。
但是,这种方法有多个缺点:
UINavigationBar
来解决此问题。4)使navigationBar透明,并将背景图像设置为透明,并在其上更改Alpha通道。
我找不到我读过这个想法的地方。提到了几次。
有一个Apple示例应用程序展示了如何自定义NavigationBar,包括使它透明。
有趣的是,这个示例应用程序对我有效(其中的导航栏是透明的)。然而,当我在我的应用程序中尝试此代码时,它无效(我仍然没有弄清楚发生了什么)。与通常情况下一样,有一堆变量(可能是Info.plist中的某些内容,也可能是它们的子类NavigationController中的某些内容,还可能是视图层次结构中的某些内容)
5)添加独立的navigationBar
您可以隐藏由navigationController提供的栏。将其添加到UIView中,将其连接到@IBOutlet,并在其中使用alpha动画(很可能这就是@rmaddy所指的内容)。
我检查过了,这行得通。
此方法在此教程中使用。
但是,它也有缺点:
每当我看到像文章中写的那样的代码时,我就知道会出现调整大小的问题:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 64.0)
您可以用约束替换它。我走了这条路,但遇到了一些问题。
6)其他方法
我看到了另外两种方法。我不知道它们是否有效或者会有什么缺点:
其中之一在这个问题中:如何像iOS 7中的相册应用程序一样同时淡入/淡出隐藏/显示状态栏和导航栏?
UINavigationController setNavigationBarHidden:animated:
方法怎么样? - rmaddynavigationBar
的alpha
属性动画化,并且它完美地工作。不确定为什么你说它不再起作用了。试试看吧。 - rmaddy