在push segue上动画barTintColor



从一个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 COLORORIGINAL 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混合类别,我为这种情况写的。你可以在这里找到。

谢谢。

相关内容

  • 没有找到相关文章

最新更新