【问题标题】:Transitioning between transparent navigation bar to translucent在透明导航栏到半透明之间转换
【发布时间】:2013-11-23 23:39:11
【问题描述】:

在 Apple 最近发布的 Remote 应用程序中,我注意到导航栏的行为方式是独一无二的,我无法重现它。弹出 Now Playing 视图控制器时,Now Playing 视图控制器的导航栏保持透明,库视图控制器的导航栏也保持半透明(屏幕截图 1)。我试图弄清楚他们是使用两个导航控制器还是只使用一个。就我个人而言,我觉得他们只使用了一个,原因有两个:(1)启用了交互式弹出手势; (2) 当您按下库视图控制器中的“正在播放”按钮时,就在正在播放的屏幕完成“推送视图控制器”动画之前,导航栏变得透明(屏幕截图 2)。这是我在推送视图控制器(将导航栏设置为透明)时遇到的行为。所以我的问题是:Apple 如何将两个视图控制器的导航栏都呈现为单独的(如屏幕截图 1 所示),即使是栏按钮、导航标题等......在切换时也是 100% 的不透明度(通常在推动/弹出前一个视图控制器的按钮和标题会随着新控制器的被推动而消失)。我尝试在两个视图控制器中使用viewDidAppearviewWillAppear 中的条形色调颜色,但无法重现相同的行为,也无法防止条形按钮褪色。

天哪,我希望我已经很好地解释了这一点,我只是想一想就感到困惑!

屏幕截图 1(弹出):

屏幕截图 2(推送):

【问题讨论】:

  • [这里][1] 很好地解释了它。通读。 [1]:stackoverflow.com/questions/17074365/…
  • @Abhinav 谢谢,但我不明白这如何解决我的问题。我不想在顶部插入。与 Remote 应用程序一样,我希望表格在导航栏下方滚动,但我也想重现屏幕截图 1,其中在转换期间为两个视图保留所有按钮、导航栏色调和标题。
  • @sooper 请测试我的答案。
  • @LeoNatan 对此表示赞赏,只是需要一些空闲时间来测试一下。但是如果我不能在赏金截止日期之前尝试它,我会接受它之前的答案。干杯

标签: ios uinavigationcontroller uinavigationbar


【解决方案1】:

我刚刚下载了应用程序以确保。使用了两个不同的导航栏。您可以使用交互式弹出手势看到这一点。注意底部视图控制器上的导航栏是如何滑入和滑出的。在正常的推送和弹出转换期间,导航项只是在现有栏上淡入和淡出,而栏是静止的。这是在推送正在播放的视图控制器之前发生的情况。

如果你快速看,在正在播放的视图控制器动画期间,你可以看到底部导航栏消失了。

根据我对 UIKit 行为的经验以及我在应用中看到的情况,我认为会发生以下情况:

album_vc = 底部,列表视图控制器 nowplaying_vc = 顶视图控制器

  • nowplaying_vcviewWillAppear:

    • 使用[self.navigationController setNavigationBarHidden:YES animated:YES]; 将导航栏设置为隐藏。由于这是在动画块中,这将使导航栏在推送动画期间滑出。
    • 设置[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; 对此非常肯定,因为请注意在状态栏样式的过渡中没有动画。它只是变成白色。
  • nowplaying_vcviewWillDisappear:

    • 使用[self.navigationController setNavigationBarHidden:NO animated:YES]; 将导航栏设置为显示。由于这是在动画块中,这将使导航栏在弹出动画期间滑入。
    • 设置[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault; 再次注意,在交互式弹出手势期间,状态栏只是在没有动画的情况下发生变化。

要实现nowplaying_vc导航栏的透明外观,您可以使用空图像([UIImage alloc])和setBackgroundImage:forBarPosition:barMetrics:

由于应用程序不旋转,我们无法确定nowplaying_vc 上的导航栏是另一个导航控制器的一部分,还是只是顶部位置为UIBarPositionTopAttached 的导航栏。据我们所知,那里甚至没有导航栏,只有一个后退 V 形图像视图(后退栏按钮由一个图像视图和一个按钮组成)。

我认为viewWillAppear:viewWillDisappear: 中的状态栏样式发生了变化,因为在交互式弹出手势期间存在不自然的感觉。我建议使用动画过渡,或者更好的是,使用新的基于视图控制器的状态栏样式,系统会自行对过渡进行动画处理。


现代 API 更新:

您应该使用animateAlongsideTransition:completion:animateAlongsideTransitionInView:animation:completion: API,而不是依赖viewWillAppear:viewWillDisappear: 的隐式动画。

【讨论】:

  • 为此欢呼,没有时间尝试,但当我尝试时一定会回复您。
  • @sooper 请保持联系。我也对发生的事情感兴趣。谢谢!
  • 我确信这是正确的方法,但我现在唯一遇到的问题是当导航栏被隐藏时交互式弹出手势被禁用。所以我不能像远程应用那样使用nowplaying_vc 中的弹出手势。
  • @sooper 你当然可以克服这个问题:keighl.com/post/ios7-interactive-pop-gesture-custom-back-button。这也适用于隐藏的导航栏。
  • @sooper 您是否在viewWillAppear: 上将其设置为隐藏(或消失)?使用 [self.navigationController setNavigationBarHidden:YES animated:YES]; 将其设置为隐藏
【解决方案2】:

您可以更新导航栏的 Alpha,而不是隐藏和显示导航栏。它将在过渡期间平滑地动画。对于具有透明导航栏的视图控制器,不要修改导航栏,而是在第二个控制器的视图中手动创建导航栏(或只是后退按钮和标题等)。然后,当从第一个视图控制器转换到第二个视图控制器时,我们将隐藏导航栏。

在第一个控制器的 viewWillDisappear 和第二个视图控制器的 viewWillAppear: 上,使用 self.navigationController.navigationBar.alpha = 0; 将导航栏的 alpha 设置为零。由于这是在动画块中,这会使导航栏在推送动画期间消失。

在第一个控制器的 viewWillAppear 和第二个控制器的 viewWillDisappear 中将 alpha 设置回一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多