首页 文章

在透明导航栏之间过渡到半透明

提问于
浏览
27

在Apple _1432929中已经能够重现它 . 当弹出正在播放视图控制器时,导航栏对于正在播放视图控制器保持透明,并且库视图控制器的导航栏也保持半透明(屏幕截图1) . 我只是因为两个原因而使用了一个原因(1)启用了交互式弹出手势; (2)当您按下库视图控制器中的'Now Playing'按钮时,就在现在播放屏幕完成'push view controller'动画之前,导航栏变为透明(屏幕截图2) . 这是我按下视图控制器时所遇到的行为(将导航栏设置为透明) . 所以我的问题是:Apple如何呈现两个视图控制器的两个视图控制器的导航栏,就像它们是个体一样(如屏幕截图1),甚至条形按钮,导航 Headers 等...切换时的不透明度为100%(通常在当按下新控制器时,按下/弹出前一个视图控制器的按钮和 Headers 会逐渐消失 . 我尝试在两个视图控制器中使用 viewDidAppearviewWillAppear 中的条形色调但不能重现相同的行为,并且无法防止条形按钮褪色 .

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

截屏1(弹出):
Screenshot 1

屏幕截图2(推送):
Screenshot 2

2 回答

  • 3

    我刚刚下载了应用程序以确保 . 使用两个不同的导航栏 . 您可以使用交互式弹出手势来查看此内容 . 请注意底部视图控制器上的导航栏如何滑入和滑出 . 在正常的推送和弹出过渡期间,导航项目只会在现有条形上淡入淡出,而条形图则是静止的 . 这是直到现在正在播放视图控制器的位置发生的情况 .

    如果你看起来很快,在现在播放的视图控制器动画中,你可以看到底部导航栏消失 .

    根据我对UIKit行为的体验以及我在应用程序中看到的内容,我认为这就是:

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

    • On 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 导航栏的透明外观,可以使用带有 setBackgroundImage:forBarPosition:barMetrics: 的空图像( [UIImage alloc] ) .

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

    我认为状态栏样式在 viewWillAppear:viewWillDisappear: 中已更改,因为在交互式弹出手势期间存在不自然的感觉 . 我建议使用动画过渡,甚至更好,使用基于视图控制器的新状态栏样式,系统会自动进行过渡动画 .


    现代API的更新:

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

  • 37

    您可以更新导航栏的alpha,而不是隐藏和显示导航栏 . 它将在过渡期间顺利进行动画制作 . 对于具有透明导航栏的视图控制器,而不是修改导航栏,在第二个控制器的视图中手动创建导航栏(或仅后退按钮和 Headers 等) . 然后,当从第一个视图控制器转换到第二个视图控制器时,我们将隐藏导航栏 .

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

    在第一个控制器的 viewWillAppear 和第二个控制器 viewWillDisappear 中将alpha设置为1 .

相关问题