在透明导航栏之间转换为半透明
在苹果公司最近发布的Remote应用程序中,我注意到导航栏的行为方式是独一无二的,我无法重现它。 当popup“正在播放”视图控制器时,导航栏对于“正在播放”视图控制器保持透明,并且库视图控制器的导航栏也保持半透明(屏幕截图1)。 我想弄清楚他们是否使用两个导航控制器或只有一个。 就我个人而言,我觉得他们只使用了一个,原因有二:(1)交互式popup手势已启用; (2)在库视图控制器中按“正在播放”button时,在现在正在播放的画面完成“推视图控制器”animation之前,导航栏变为透明(截图2)。 这是我推动我的视图控制器(将导航栏设置为透明)时遇到的行为。 所以我的问题是:苹果如何呈现两个视图控制器的导航栏,就像他们是个人的(如截图1),即使是酒吧button,导航标题等…是100%在不透明的时候切换(通常时当新的控制器被按下时,按压/popup前一个视图控制器的button和标题淡出)。 我已经尝试在视图控制器中使用viewDidAppear
和viewWillAppear
中的酒吧色调颜色,但不能重现相同的行为,并且不能防止酒吧button褪色。
天哪,我希望我已经解释清楚了,我只是想着它而感到困惑!
截图1(Popping):
截图2(推):
我刚刚下载了应用程序来确保。 使用两个不同的导航栏。 你可以通过使用交互式popup手势来看到这一点。 注意底部视图控制器上的导航栏如何滑入和滑出。 在正常的推送和popup过渡期间,导航项目仅在现有栏上淡入淡出,而栏杆则静止不动。 这是发生的事情,直到现在正在播放的视图控制器被推动。
如果快速查看,在正在播放的视图控制器animation中,您可以看到底部导航栏消失。
从我的UIKit行为和我在应用程序中看到的经验来看,这里是我所想的事情:
album_vc
=底部,列表视图控制器nowplaying_vc
=顶部视图控制器
-
在
nowplaying_vc
的viewWillAppear:
- 使用
[self.navigationController setNavigationBarHidden:YES animated:YES];
将导航栏设置为隐藏[self.navigationController setNavigationBarHidden:YES animated:YES];
。 由于这是在animation块中,这将使导航栏在推动animation期间滑出。 - 设置
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
很确定这一点,因为注意状态栏样式的过渡没有animation。 它变成了白色。
- 使用
-
nowplaying_vc
的viewWillDisappear:
- 将导航栏设置为使用
[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设置回一个。