分享我的所有发现。
投诉模式开启
坦率地说,我感到有点生气/像个傻瓜,我不得不与美好的一天抗争以实现 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:
这是隐藏/显示导航栏的标准方式。它的动画方式不同(它滑动/向上和向下)。不过,如果你觉得没问题,就用这个吧,因为它简单干净。
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)
我将通过层次结构向上获取一个包含私有导航栏的视图(这是该视图的第二个子视图)。
但是,这种方法有多个缺点:
- 我相信超级浏览次数?取决于您的应用层次结构(与您使用拆分视图等相比)。我认为您可以概括,或者您可能只是遍历整个层次结构以找到非隐藏的
UINavigationBar 来解决这个问题。
- 我有一种感觉,Apple 可能会对此皱眉(您的应用不会被 AppStore 接受)
4) 将navigationBar设为透明并将背景图片设置为透明并更改其上的alpha通道。
我找不到我在哪里读到这个想法。有几个提到。
Apple example app 展示了如何自定义 NavigationBar,包括使其透明。
有趣的是,这个示例应用程序对我有用(导航栏在其中是透明的)。但是,当我在我的应用程序中尝试此代码时,它不起作用(我仍然没有弄清楚这是怎么回事)。像往常一样有一堆变量(可能是 Info.plist 中的一些东西,它们也是 NavigationController 的子类,也可能是视图层次结构中的一些东西)
5) 添加独立导航栏
您可以隐藏由 navigationController 提供的栏。将您自己的添加到 UIView,将其连接到 @IBOutlet 并在其上使用 alpha 动画(很可能这也是 @rmaddy 所指的)。
我检查了,这是可行的。
this 教程中使用了这种方法。
但是,它有一个缺点:
- 我认为它不能很好地处理旋转、通话或 GPS 时状态栏高度的增加
每次看到这样的代码(写在文章里)就知道resize会有问题: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