ios - 如何在 iOS 9 上淡入/淡出导航栏?

标签 ios uinavigationbar ios9

当您点击图像时,内置的照片应用程序会淡入/淡出导航栏。这样照片应用程序允许全屏查看。

它是如何做到的(淡化效果)?

据我了解navigationController?.navigationBar.alpha不再起作用(因此您不能以这种方式对其进行动画处理)。

最佳答案

分享我所有的发现。

上的投诉模式

坦率地说,我感到有点生气/就像一个傻瓜,我不得不为实现 Apple 应用程序中存在的简单事物而奋斗。

投诉模式关闭

首先,这里有一些上下文。我正在使用由 navigationController 提供的导航栏(与手动删除的独立栏相比)

我发现了几种方法。我会提到所有这些(即使我没有成功使用它们)

1)navigationBar alpha的动画变化

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

@rmaddy 在这里提到它对他有用。但是,我相信他有一个独立的栏(与由 navigationController 管理的栏相比)。

我用了一个工具Reveal检查 UI 层次结构并发现几件事。
- 有一个隐藏的导航栏(navigationController?.navigationBar 正在引用它)。因此,您可以将 alpha 更改为您心中的喜悦,但这些更改将不可见。

然而,还有另一个 navigationBar 。我假设它在 navigationController 的一些私有(private)成员中被引用(我们称它为私有(private) navigationBar)。它是可见的,这就是显示在 View 顶部的内容。

2) 使用 setNavigationBarHidden:animated:

这是隐藏/显示导航栏的标准方式。它的动画方式不同(它滑动/向上和向下)。但是,如果它适合你,就选择这个,因为它简单干净。
navigationController?.setNavigationBarHidden(true, animated: true)

此外,您可以将其包装在 UIView.beginAnimations、UIView.commitAnimations 中以将其与其他一些东西一起制作动画(使其更流畅)

3) 私有(private)导航栏 alpha 的动画变化。

这对我有用:
 let privateNavigationBar = self.superview?.superview?.superview?.superview?.superview?.superview?.subviews[1]
 UIView.animateWithDuration(0.1, animations: {
       privateNavigationBar.alpha = 0
    }, completion: nil)

我将通过层次结构向上获取一个包含私有(private)导航栏的 View (这是该 View 的第二个 subview )。

但是,这种方法有多个缺点:
  • 我相信#superviews?取决于您的应用层次结构(与您使用 Split View等相比)。我认为您可以概括,或者您可能只是遍历整个层次结构以找到非隐藏的UINavigationBar解决这个问题。
  • 我有一种感觉,Apple 可能会对此皱眉(您的应用程序不被 AppStore 接受)

  • 4)使navigationBar透明并将背景图像设置为透明并更改其上的alpha channel 。

    我找不到我在哪里读到这个想法。有几个提到。

    Apple example app它显示了如何自定义 NavigationBar,包括使其透明。

    有趣的是,这个示例应用程序对我有用(导航栏在其中是透明的)。但是,当我在我的应用程序中尝试此代码时,它不起作用(我仍然没有弄清楚这是怎么回事)。像往常一样有一堆变量(可能是 Info.plist 中的一些东西,它们也是 NavigationController 的子类,也可能是 View 层次结构中的一些东西)

    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

    关于ios - 如何在 iOS 9 上淡入/淡出导航栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36819359/

    相关文章:

    ios - 在ios中处理远程通知接收

    ios - 使用 MKOverlayRenderer 绘制文本

    uinavigationbar - UITableView 部分标题在导航栏下方蠕动

    iOS9 通用链接不适用于 Safari,但适用于其他应用程序

    ios - 如何删除内存中的 MKMapView?

    ios - react native : how to change status bar icon colors

    iphone - 使用字符串 "Settings"设置 Controller 标题不起作用

    iphone - 导航栏后退按钮,文本未居中对齐

    ios - 无法在 iOS 9 的 UIWebView 中加载 HTTP 链接

    swift - 从一个 UINavigationController 转到另一个 UINavigationController (Swift iOS 9, xcode 7)