今天需求说要给在进入某个页面给某个按钮加上放大效果,心想这还不简单,于是三下五除二的把动画加上提交测试了.
下面是动画的代码
NSTimeInterval time = CACurrentMediaTime(); time = time + 0.5; CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"]; //设置value CATransform3D scale1 = CATransform3DMakeScale(1.1, 1.1, 1); CATransform3D scale2 = CATransform3DMakeScale(1.0, 1.0, 1); animation.values = @[[NSValue valueWithCATransform3D:scale2],[NSValue valueWithCATransform3D:scale1],[NSValue valueWithCATransform3D:scale2]]; //重复次数 默认为1 animation.repeatCount = 1; //设置是否原路返回默认为NO animation.autoreverses = NO; animation.beginTime = time; animation.duration = 0.5; animation.keyTimes = @[@0.0,@0.7,@1]; animation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; //给这个view加上动画效果 [view.layer addAnimation:animation forKey:@"transform.scale"];
然而后面却出现了一个诡异的bug.当动画正在进行的时候滚动scrollView,则会崩溃,并且报下面的错误.
[NSConcreteValue doubleValue]: unrecognized selector sent to instance
上stackoverflow上发现解释如下,
The transform.scale should be a double type, if you assign fromValue or toValue of CABasicAnimation a NSValue type, it cann't convert to double value, and so App crashed.
翻译一下就是transform.scale应该用double类型的数值来赋值,如果用NSValue封装好的值来给fromValue和toValue赋值的话,则会解析不到对应的值,表现为app崩溃.
于是修改代码如下,完美运行,不会崩溃了.
NSTimeInterval time = CACurrentMediaTime(); time = time + 0.5; //设置value CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"]; //设置value animation.values = @[@1,@1.1,@1]; //重复次数 默认为1 animation.repeatCount = 1; //设置是否原路返回默认为NO animation.autoreverses = NO; animation.beginTime = time; animation.duration = 0.5; animation.keyTimes = @[@0.0,@0.7,@1]; animation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; //给这个view加上动画效果 [view.layer addAnimation:animation forKey:@"transform.scale"];