当从一个view controller
过渡到另一个时,我想动画barTintColor
属性。
我尝试了以下解决方案:
[[self transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
self.navigationController.navigationBar.translucent = NO;
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
} completion:nil];
使barTintColor
动画,但我的导航栏应该是半透明的。为了解决这个问题,我试图在trasitionCoordinator
动画的完成块中将其设置为translucent = YES
。这样的:
completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
self.navigationController.navigationBar.translucent = YES;
}
,但这会导致动画完成后导航栏的barTintColor
值略有跳跃。这是预期的,因为半透明和不透明的颜色是不同的。
相似的问题:[1][2]
提前感谢!
编辑:
我忘了添加一些奇怪的缩放动画出现在导航栏左上角,如果我从动画块中删除self.navigationController.navigationBar.translucent = NO;
行。所以这也不是解决方案
我将回答我自己的问题,同时也愿意听取其他人的建议/解决方案。
我的解决方案,我认为是相当"干净的一个"是使一个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混合类别,我为这种情况写的。你可以在这里找到。
谢谢。