在透明导航栏之间转换为半透明

在苹果公司最近发布的Remote应用程序中,我注意到导航栏的行为方式是独一无二的,我无法重现它。 当popup“正在播放”视图控制器时,导航栏对于“正在播放”视图控制器保持透明,并且库视图控制器的导航栏也保持半透明(屏幕截图1)。 我想弄清楚他们是否使用两个导航控制器或只有一个。 就我个人而言,我觉得他们只使用了一个,原因有二:(1)交互式popup手势已启用; (2)在库视图控制器中按“正在播放”button时,在现在正在播放的画面完成“推视图控制器”animation之前,导航栏变为透明(截图2)。 这是我推动我的视图控制器(将导航栏设置为透明)时遇到的行为。 所以我的问题是:苹果如何呈现两个视图控制器的导航栏,就像他们是个人的(如截图1),即使是酒吧button,导航标题等…是100%在不透明的时候切换(通常时当新的控制器被按下时,按压/popup前一个视图控制器的button和标题淡出)。 我已经尝试在视图控制器中使用viewDidAppearviewWillAppear中的酒吧色调颜色,但不能重现相同的行为,并且不能防止酒吧button褪色。

天哪,我希望我已经解释清楚了,我只是想着它而感到困惑!

截图1(Popping): 截图1

截图2(推): 截图2

我刚刚下载了应用程序来确保。 使用两个不同的导航栏。 你可以通过使用交互式popup手势来看到这一点。 注意底部视图控制器上的导航栏如何滑入和滑出。 在正常的推送和popup过渡期间,导航项目仅在现有栏上淡入淡出,而栏杆则静止不动。 这是发生的事情,直到现在正在播放的视图控制器被推动。

如果快速查看,在正在播放的视图控制器animation中,您可以看到底部导航栏消失。

从我的UIKit行为和我在应用程序中看到的经验来看,这里是我所想的事情:

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

  • nowplaying_vcviewWillAppear:

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

    • 将导航栏设置为使用[self.navigationController setNavigationBarHidden:NO animated:YES]; 。 由于这是在animation块中,所以这将使得导航条在popupanimation期间滑入。
    • 设置[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault; 再次注意,在交互式popup手势中,状态栏只是在没有animation的情况下改变。

为了实现nowplaying_vc的导航条的透明外观,你可以在setBackgroundImage:forBarPosition:barMetrics:使用一个空的图像( [UIImage alloc] )。

由于应用程序不旋转,因此我们无法确定nowplaying_vc上的导航栏是否是另一个导航控制器的一部分,或者只是位于顶部的导航栏的UIBarPositionTopAttached位置。 对于我们所知道的,在那里甚至没有导航栏,只有后面的人字形图像视图(后面的栏button由图像视图和button组成)。

我认为状态栏的风格在viewWillAppear:viewWillDisappear:被改变了viewWillDisappear:由于在交互式popup手势期间有不自然的感觉。 我会build议使用animation过渡,或者甚至更好,使用基于新的视图控制器的状态栏样式,系统自己animation过渡。

而不是隐藏和显示导航栏,您可以更新导航栏的alpha。 它将在过渡期间顺利进行animation。 对于具有透明导航栏的视图控制器,而不是修改导航栏,在第二个控制器的视图中手动创build一个导航栏(或只是后退button和标题等)。 从第一个视图控制器转换到第二个视图控制器时,我们将隐藏导航栏。

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

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