如何在iOS 9上淡入/淡出navigationBar?
点击图像时,内置照片应用程序会淡入/淡出navigationBar。 这种方式照片应用程序允许全屏查看。
它是如何做到的(淡化效果)?
据我了解navigationController?.navigationBar.alpha
不再起作用(所以你不能用这种方式设置它的动画)。
分享我的所有发现。
投诉模式开启
坦率地说,我感到有点生气/像个假人,我不得不为实现Apple应用程序中存在的简单事物而度过美好的一天。
投诉模式关闭
首先,这里是一些背景。 我正在使用由navigationController提供的navigationBar(vs只是在视图中手动删除的独立栏)
我找到了几种方法。 我会提到所有这些(即使我没有成功使用它们)
1)使用navigationBar的alpha变化动画
UIView.animateWithDuration(0.1, animations: { navigationController?.navigationBar.alpha = 0 }, completion: nil)
@rmaddy在这里提到它对他有用。 但是,我相信他有一个独立的栏(与由navigationController管理的栏)。
我使用Reveal工具检查UI层次结构并发现了几件事。 – 有一个隐藏的navigationBar(和navigationController?.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
整个层次结构来找到非隐藏的UINavigationBar
来解决这个问题。 - 我有一种感觉,苹果可能会对此不满(你的应用程序不被AppStore接受)
4)使navigationBar透明并将背景图像设置为透明并更改其上的alpha通道。
我找不到我读到这个想法的地方。 有几个提到。
Apple示例应用程序显示了如何自定义NavigationBar,包括使其透明。
有趣的是,这个示例应用程序适用于我(导航栏是透明的)。 但是,当我在我的应用程序中尝试此代码时,它不起作用(我仍然没有弄清楚这是怎么回事)。 像往常一样有很多变量(可能是Info.plist中的东西,也是它们子类的NavigationController,也可能是视图层次结构中的东西)
5)添加独立的navigationBar
您可以隐藏由navigationController提供的栏。 将自己添加到UIView,将其连接到@IBOutlet并在其上使用alpha动画(很可能是@rmaddy所指的)。
我检查了,这是工作。
本教程中使用了此方法。
但是,它有一个缺点:
- 我相信它不会处理好旋转,在通话或GPS时增加状态栏高度
每次当我看到这样的代码(写在文章中)时,我知道resize会有问题: CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 64.0)
您可以使用约束替换它。 我走了这条路,但偶然发现了一些问题。
6)其他方法
我看到了另外两种方法。 我不知道它们是否有用或有什么缺点:
其中一个在这个问题: 如何通过淡入/淡出同时隐藏/显示状态栏和导航栏,如iOS 7中的照片应用程序?
这个答案: https : //stackoverflow.com/a/18063898/422080