iPhone-转换形状的动画

如何做转换形状的动画?从椭圆到矩形,从矩形到椭圆。

代码:

UIBezierPath *roundedRectBezierPath = [UIBezierPath bezierPathWithRoundedRect:newRect cornerRadius:10];
UIBezierPath *ovalBezierPath = [UIBezierPath bezierPathWithOvalInRect:newRect];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"path"];
animation.duration = 3;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
if (isRect) {
    self.shapeLayer.path = roundedRectBezierPath.CGPath;
    animation.fromValue = (__bridge id)(ovalBezierPath.CGPath);
    animation.toValue = (__bridge id)(roundedRectBezierPath.CGPath);
} else {
    self.shapeLayer.path = ovalBezierPath.CGPath;
    animation.fromValue = (__bridge id)(roundedRectBezierPath.CGPath);
    animation.toValue = (__bridge id)(ovalBezierPath.CGPath);
}    
[self.shapeLayer addAnimation:animation forKey:@"animatePath"];

结果如下:

CSDN移动问答

怎么变成这样呢。我希望图片能收缩和膨胀,而不是这样重画。

这段代码的逻辑看起来是对的,但是会有一些细节问题。


首先,你需要将 self.shapeLayer.path 设为你最终想要的路径,然后将 animation.fromValue 和 animation.toValue 设为当前的路径和最终的路径。这样,在动画执行期间,形状层就会从当前路径变换到最终的路径。


其次,你还可以尝试调整动画的 timingFunction 属性,来获得更好的动画效果。你可以使用不同的时间函数(如 kCAMediaTimingFunctionEaseIn 或 kCAMediaTimingFunctionEaseOut),或者创建自定义的时间函数来调整动画的速度。


最后,你可能需要调整动画的 duration,以获得更好的动画效果。