如何在 iOS 9 上淡化 in/out 导航栏?
How to fade in/out navigationBar on iOS 9?
当您点击图像时,内置照片应用程序会淡化 in/out 导航栏。这样照片应用程序就可以全屏查看了。
它是如何做到这一点的(淡化效果)?
据我所知,navigationController?.navigationBar.alpha
不再有效(所以你不能用这种方式制作动画)。
分享我的所有发现。
投诉模式开启
坦率地说,我觉得有一半 pissed/like 是个傻瓜,我不得不为实现 Apple 应用程序中存在的简单功能而奋斗。
关闭投诉模式
首先是一些上下文。我正在使用 navigationController 提供的 navigationBar(相对于手动放置在您视图中的独立栏)
我发现了几种方法。我会提到所有这些(即使我没有成功使用它们)
1) 动画改变 navigationBar 的 alpha
UIView.animateWithDuration(0.1, animations: {
navigationController?.navigationBar.alpha = 0
}, completion: nil)
@rmaddy 在这里提到它对他有用。但是,我相信他有一个独立的栏(相对于由 navigationController 管理的栏)。
我使用工具 Reveal 检查 UI 层次结构并发现了一些东西。
- 有一个隐藏的导航栏(navigationController?.navigationBar
正在引用它)。所以你可以改变 alpha 到你心中的喜悦,但这些变化不会是可见的。
但是还有另一个 navigationBar 。我假设它在 navigationController 的一些私有成员中被引用(我们称它为私有 navigationBar)。它是可见的,这就是显示在您视图顶部的内容。
2) 使用setNavigationBarHidden:animated:
这是 hide/show 导航栏的标准方式。它的动画方式不同(slides/up 及以下)。但是,如果你觉得合适,就选择这个吧,因为它简单干净。
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)
我将向上遍历层次结构以获得包含私有导航栏的视图(这是该视图的第二个子视图)。
但是,这种方法有多个缺点:
- 我相信 # 的 superviews?取决于您的应用程序层次结构(与您使用拆分视图等相比)。我认为您可以概括,或者您只是遍历整个层次结构以找到非隐藏
UINavigationBar
来解决这个问题。
- 我有一种感觉,Apple 可能对此不满意(你的应用程序不被 AppStore 接受)
4) 使 navigationBar 透明并将背景图像设置为透明并更改其上的 alpha 通道。
我找不到我在哪里读到过这个想法。有几个提到。
Apple example app 展示了如何自定义 NavigationBar,包括使其透明。
有趣的是,这个示例应用程序适合我(导航栏在其中是透明的)。但是,当我在我的应用程序中尝试这段代码时,它不起作用(我仍然没有弄清楚这是怎么回事)。像往常一样有一堆变量(可能是 Info.plist 中的东西,它们也是 NavigationController 的子类,也可能是视图层次结构中的东西)
5) 添加独立的导航栏
您可以隐藏导航控制器提供的栏。将您自己的添加到 UIView,将其连接到 @IBOutlet 并在其上使用 alpha 动画(很可能这也是 @rmaddy 所指的)。
我检查了一下,这是工作。
此方法在 this 教程中使用。
但是,它有一个缺点:
- 我认为它不能很好地处理旋转、通话或 GPS 时状态栏高度的增加
每次看到这样的代码(写在文章中)就知道resizing会有问题: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?
这个答案:
当您点击图像时,内置照片应用程序会淡化 in/out 导航栏。这样照片应用程序就可以全屏查看了。
它是如何做到这一点的(淡化效果)?
据我所知,navigationController?.navigationBar.alpha
不再有效(所以你不能用这种方式制作动画)。
分享我的所有发现。
投诉模式开启
坦率地说,我觉得有一半 pissed/like 是个傻瓜,我不得不为实现 Apple 应用程序中存在的简单功能而奋斗。
关闭投诉模式
首先是一些上下文。我正在使用 navigationController 提供的 navigationBar(相对于手动放置在您视图中的独立栏)
我发现了几种方法。我会提到所有这些(即使我没有成功使用它们)
1) 动画改变 navigationBar 的 alpha
UIView.animateWithDuration(0.1, animations: {
navigationController?.navigationBar.alpha = 0
}, completion: nil)
@rmaddy 在这里提到它对他有用。但是,我相信他有一个独立的栏(相对于由 navigationController 管理的栏)。
我使用工具 Reveal 检查 UI 层次结构并发现了一些东西。
- 有一个隐藏的导航栏(navigationController?.navigationBar
正在引用它)。所以你可以改变 alpha 到你心中的喜悦,但这些变化不会是可见的。
但是还有另一个 navigationBar 。我假设它在 navigationController 的一些私有成员中被引用(我们称它为私有 navigationBar)。它是可见的,这就是显示在您视图顶部的内容。
2) 使用setNavigationBarHidden:animated:
这是 hide/show 导航栏的标准方式。它的动画方式不同(slides/up 及以下)。但是,如果你觉得合适,就选择这个吧,因为它简单干净。
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)
我将向上遍历层次结构以获得包含私有导航栏的视图(这是该视图的第二个子视图)。
但是,这种方法有多个缺点:
- 我相信 # 的 superviews?取决于您的应用程序层次结构(与您使用拆分视图等相比)。我认为您可以概括,或者您只是遍历整个层次结构以找到非隐藏
UINavigationBar
来解决这个问题。 - 我有一种感觉,Apple 可能对此不满意(你的应用程序不被 AppStore 接受)
4) 使 navigationBar 透明并将背景图像设置为透明并更改其上的 alpha 通道。
我找不到我在哪里读到过这个想法。有几个提到。
Apple example app 展示了如何自定义 NavigationBar,包括使其透明。
有趣的是,这个示例应用程序适合我(导航栏在其中是透明的)。但是,当我在我的应用程序中尝试这段代码时,它不起作用(我仍然没有弄清楚这是怎么回事)。像往常一样有一堆变量(可能是 Info.plist 中的东西,它们也是 NavigationController 的子类,也可能是视图层次结构中的东西)
5) 添加独立的导航栏
您可以隐藏导航控制器提供的栏。将您自己的添加到 UIView,将其连接到 @IBOutlet 并在其上使用 alpha 动画(很可能这也是 @rmaddy 所指的)。
我检查了一下,这是工作。
此方法在 this 教程中使用。
但是,它有一个缺点:
- 我认为它不能很好地处理旋转、通话或 GPS 时状态栏高度的增加
每次看到这样的代码(写在文章中)就知道resizing会有问题: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?
这个答案: