当view controller从一个过渡到另一个时,我想给属性注入动画。
我尝试了以下解决办法:
[[self transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
self.navigationController.navigationBar.translucent = NO;
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
} completion:nil];它将barTintColor作为动画,但我的导航栏应该是半透明的。为了解决这个问题,我尝试在trasitionCoordinator动画的完成块中将其设置为trasitionCoordinator。如下所示:
completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
self.navigationController.navigationBar.translucent = YES;
}但是,这会导致在动画完成后,导航栏的值略有上升。这是预期的,因为半透明和不透明的颜色是不同的。
提前感谢!
编辑
我忘记添加一些奇怪的缩放动画,如果我从动画块中删除行,就会从导航栏的左上角出现一些奇怪的动画。所以这也不是解决办法。
发布于 2014-05-29 15:45:44
我将在接受其他建议/解决方案的同时回答我自己的问题。
我的解决方案,我认为是相当“干净的一个”,是使一个α混合颜色从原来的颜色与适当的混合色。因此,假设我们在导航栏后面有一个白色背景,我们希望将当前的导航栏 barTintColor动画为绿色。在这种情况下,我们必须将原始绿色与白色和适当的阿尔法值混合。
在玩了一些值之后,我发现alpha 0.16对iOS 7的效果最好(我还没有在其他操作系统版本上测试过)。
在用我的解决方案实现的原始问题中编写的动画块如下所示:
注意α混合原色和原色
[[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;
}];α-共混的方程
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的阿尔法混合类别,您可以找到它的这里。
谢谢。
https://stackoverflow.com/questions/23935398
复制相似问题