【问题标题】:How to fade in/out navigationBar on iOS 9?如何在 iOS 9 上淡入/淡出导航栏?
【发布时间】:2016-04-24 04:44:25
【问题描述】:

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

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

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

【问题讨论】:

  • UINavigationController setNavigationBarHidden:animated: 方法呢?
  • 顺便说一句 - 我有一个应用程序可以为 navigationBaralpha 属性设置动画,它工作得很好。不知道为什么你说它不再起作用了。试试看。
  • @rmaddy 它显示和隐藏导航栏。但是,它使用不同的动画。它上下滑动(相对于淡入淡出)
  • @rmaddy。关于 alpha 属性。我刚刚创建了新项目(主从项目)。我将以下代码添加到 DetailViewController。我运行该项目并打开了详细信息视图,但我没有看到导航栏的任何更改。我检查了代码是否被调用。您的导航栏有什么特别之处吗?你能试试新的(干净的)项目吗?我添加的代码是“覆盖 func viewDidAppear(animated: Bool) { UIView.animateWithDuration(1.0, animations: { self.navigationController?.navigationBar.alpha = 0 }, completion: nil) }”

标签: ios uinavigationbar ios9


【解决方案1】:

分享我的所有发现。

投诉模式开启

坦率地说,我感到有点生气/像个傻瓜,我不得不与美好的一天抗争以实现 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多