您正在创建一个CAShapeLayer
,但没有对它做任何有用的事情。让我们解决这个问题。
不要在 中设置图层和动画-drawRect:
,因为这严格来说是使用 CoreGraphics 或 UIKit API 进行绘图的时间。相反,您希望 CAShapeLayer 绘制三角形——这样您就可以对其进行动画处理。
CAKeyframeAnimation.path 用于完全不同的东西(例如沿路径移动图层)。
您的动画正在position
为图层的值设置动画。它移动图层也就不足为奇了!您想为该path
值设置动画。
CAKeyframeAnimation 背后的想法是你提供一个数组values
来设置图层的属性。在关键帧之间的时间里,它将在两个相邻的关键帧之间进行插值。所以你需要给它几条路径——每边一条。
插值任意路径是困难的。当路径具有相同数量和类型的元素时,CA 的路径插值效果最佳。因此,我们确保我们所有的路径都具有相同的结构,只是一些点彼此重叠。
动画的秘诀,也许是整个计算机的秘诀:你必须准确地解释你想要发生的事情。“我想为每个点的绘图设置动画,所以它看起来是动画的”是不够的信息。
这是一个 UIView 子类,我认为它可以满足您的要求,或者至少可以满足您的要求。要制作动画,请将按钮与动作挂钩-animate:
。
SPAnimatedShapeView.h:
#import <UIKit/UIKit.h>
@interface SPAnimatedShapeView : UIView
- (IBAction)animate:(id)sender;
@end
SPAnimatedShapeView.m:
#import "SPAnimatedShapeView.h"
#import <QuartzCore/QuartzCore.h>
@interface SPAnimatedShapeView ()
@property (nonatomic, retain) CAShapeLayer* shapeLayer;
@end
@implementation SPAnimatedShapeView
@synthesize shapeLayer = _shapeLayer;
- (void)dealloc
{
[_shapeLayer release];
[super dealloc];
}
- (void)layoutSubviews
{
if (!self.shapeLayer)
{
self.shapeLayer = [[[CAShapeLayer alloc] init] autorelease];
self.shapeLayer.bounds = CGRectMake(0, 0, 100, 100); // layer is 100x100 in size
self.shapeLayer.position = self.center; // and is centered in the view
self.shapeLayer.strokeColor = [UIColor blueColor].CGColor;
self.shapeLayer.fillColor = [UIColor redColor].CGColor;
self.shapeLayer.lineWidth = 3.f;
[self.layer addSublayer:self.shapeLayer];
}
}
- (IBAction)animate:(id)sender
{
UIBezierPath* path0 = [UIBezierPath bezierPath];
[path0 moveToPoint:CGPointZero];
[path0 addLineToPoint:CGPointZero];
[path0 addLineToPoint:CGPointZero];
[path0 addLineToPoint:CGPointZero];
UIBezierPath* path1 = [UIBezierPath bezierPath];
[path1 moveToPoint:CGPointZero];
[path1 addLineToPoint:CGPointMake(50,100)];
[path1 addLineToPoint:CGPointMake(50,100)];
[path1 addLineToPoint:CGPointMake(50,100)];
UIBezierPath* path2 = [UIBezierPath bezierPath];
[path2 moveToPoint:CGPointZero];
[path2 addLineToPoint:CGPointMake(50,100)];
[path2 addLineToPoint:CGPointMake(100,0)];
[path2 addLineToPoint:CGPointMake(100,0)];
UIBezierPath* path3 = [UIBezierPath bezierPath];
[path3 moveToPoint:CGPointZero];
[path3 addLineToPoint:CGPointMake(50,100)];
[path3 addLineToPoint:CGPointMake(100,0)];
[path3 addLineToPoint:CGPointZero];
CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"path"];
animation.duration = 4.0f;
animation.values = [NSArray arrayWithObjects:(id)path0.CGPath, (id)path1.CGPath, (id)path2.CGPath, (id)path3.CGPath, nil];
[self.shapeLayer addAnimation:animation forKey:nil];
}
@end