在Apple最近发布的Remote应用程序中,我注意到导航栏的行为方式是独特的,我无法重现它。当弹出正在播放视图控制器时,导航栏对于正在播放视图控制器保持透明,并且库视图控制器的导航栏也保持半透明(屏幕截图1)。我想弄清楚他们是使用两个导航控制器还是只使用一个。我个人觉得他们只使用一个有两个原因(1)启用了交互式弹出手势; (2)当您按下库视图控制器中的“正在播放”按钮时,就在现在播放屏幕完成“推视控制器”动画之前,导航栏变为透明(屏幕截图2)。这是我按下视图控制器时所遇到的行为(将导航栏设置为透明)。所以我的问题是:Apple如何呈现两个视图控制器的两个视图控制器的导航栏,就像它们是个体一样(如屏幕截图1),甚至条形按钮,导航标题等...切换时的不透明度为100%(通常在当按下新控制器时,按下/弹出前一个视图控制器的按钮和标题会逐渐消失。我尝试在两个视图控制器中使用viewDidAppear
和viewWillAppear
中的条形色调但不能重现相同的行为,并且无法防止条形按钮褪色。
天哪,我希望我已经很好地解释了这一点,我只是想着它而感到困惑!
截屏1(弹出):
截屏2(推送):
答案 0 :(得分:37)
我刚下载了应用程序以确保。使用两个不同的导航栏。您可以使用交互式弹出手势来查看此内容。请注意底部视图控制器上的导航栏如何滑入和滑出。在正常的推送和弹出过渡期间,导航项目只会在现有条形上淡入淡出,而条形图则是静止的。这是在推动正在播放的视图控制器之前发生的事情。
如果你看起来很快,在现在播放的视图控制器动画中,你可以看到底部导航栏消失。
根据我对UIKit行为的体验以及我在应用中看到的内容,我认为这就是:
album_vc
=底部列表视图控制器
nowplaying_vc
=顶级视图控制器
在nowplaying_vc
的{{1}}
viewWillAppear:
将导航栏设置为隐藏。由于这是在动画块中,这将使推导动画期间导航栏滑出。[self.navigationController setNavigationBarHidden:YES animated:YES];
非常确定这一点,因为注意状态栏样式的转换中没有动画。它变成了白色。在[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
的{{1}}
nowplaying_vc
将导航栏设置为显示。由于这是在动画块中,这将使导航栏在流行动画期间滑入。viewWillDisappear:
再次注意,在交互式弹出手势期间,状态栏只是在没有动画的情况下更改。要获得[self.navigationController setNavigationBarHidden:NO animated:YES];
导航栏的透明外观,您可以使用[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
的空图像(nowplaying_vc
)。
由于应用程序不会旋转,我们无法确定[UIImage alloc]
上的导航栏是否是另一个导航控制器的一部分,或者只是位于顶部且位置为setBackgroundImage:forBarPosition:barMetrics:
的导航栏。据我们所知,那里甚至没有导航栏,只有后面的人字形图像视图(后栏按钮由图像视图和按钮组成)。
我认为状态栏样式在nowplaying_vc
和UIBarPositionTopAttached
中已更改,因为在交互式弹出手势期间存在不自然的感觉。我建议使用动画过渡,甚至更好,使用基于视图控制器的新状态栏样式,系统会自动进行过渡动画。
现代API更新:
您应该使用viewWillAppear:
或viewWillDisappear:
API,而不是依赖animateAlongsideTransition:completion:
和animateAlongsideTransitionInView:animation:completion:
的隐式动画。
答案 1 :(得分:3)
您可以更新导航栏的Alpha,而不是隐藏和显示导航栏。它将在过渡期间顺利进行动画制作。对于具有透明导航栏的视图控制器,而不是修改导航栏,在第二个控制器的视图中手动创建导航栏(或仅后退按钮和标题等)。然后,当从第一个视图控制器转换到第二个视图控制器时,我们将隐藏导航栏。
在第一个控制器的viewWillDisappear
和第二个视图控制器的viewWillAppear:
上,使用self.navigationController.navigationBar.alpha = 0;
将导航栏alpha设置为零。由于这是在动画块中,这将使推导动画期间导航栏消失。
在第一个控制器的viewWillAppear
和第二个控制器viewWillDisappear
中将alpha设置为1。