我希望在从barTintColor
过渡到另一个时为view controller
属性设置动画。
我尝试过以下解决方案:
[[self transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
self.navigationController.navigationBar.translucent = NO;
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
} completion:nil];
动画barTintColor
,但我的导航栏应该是半透明的。要解决此问题,我尝试在translucent = YES
动画的完成块中将其设置为trasitionCoordinator
。像这样:
completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
self.navigationController.navigationBar.translucent = YES;
}
但在动画完成后,这会导致导航栏的barTintColor
值略微跳跃。这是预期的,因为半透明和不透明的颜色是不同的。
提前致谢!
修改:
如果我从动画块中删除self.navigationController.navigationBar.translucent = NO;
行,我忘了添加一些奇怪的比例动画从导航栏的左上角出现。因此,这也不是解决方案。
答案 0 :(得分:3)
我会回答我自己的问题,同时仍然愿意接受其他建议/解决方案。
我认为我的解决方案非常“干净”是使用适当的混合颜色从原始颜色制作 alpha混合颜色。因此,假设我们在导航栏背后有白色背景,我们希望将当前导航栏 barTintColor
设置为绿色。在这种情况下,我们必须将原始绿色与白色和适当的alpha值混合。
在玩了一些值后,我发现alpha 0.16 最适合iOS 7的情况(我没有在其他操作系统版本上测试过)。
使用我的解决方案实现的原始问题中编写的动画块如下所示:
注意 ALPHA BLENDED ORIGINAL COLOR 和 ORIGINAL COLOR
[[self transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
self.navigationController.navigationBar.translucent = NO;
self.navigationController.navigationBar.barTintColor = <ALPHA BLENDED ORIGINAL COLOR>;
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
self.navigationController.navigationBar.barTintColor = <ORIGINAL COLOR>;
self.navigationController.navigationBar.translucent = YES;
}];
Alpha混合的公式:
CGFloat bR = ((bcR - cR) * alpha + cR);
CGFloat bG = ((bcG - cG) * alpha + cG);
CGFloat bB = ((bcB - cB) * alpha + cB);
值:
cR, cG, cB = original color R,G,B components
bcR, bcG, bcB = blending color R,G,B components
alpha = alpha value to blend with
================================================
bR, bG, bB = blended R,G,B components
欢迎任何喜欢此解决方案的人使用UIColor
类别进行我为此案例编写的Alpha混合。你可以找到它here。
感谢。