在push segue上设置barTintColor动画

时间:2014-05-29 14:09:30

标签: ios iphone objective-c uinavigationbar bartintcolor

我希望在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值略微跳跃。这是预期的,因为半透明和不透明的颜色是不同的。

类似的问题: [1] [2]

提前致谢!

修改

如果我从动画块中删除self.navigationController.navigationBar.translucent = NO;行,我忘了添加一些奇怪的比例动画从导航栏的左上角出现。因此,这也不是解决方案。

1 个答案:

答案 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

感谢。