jki*_*gel 7 iphone objective-c calayer quartz-2d ios
我试图通过以下方式为线条绘制动画:
CAShapeLayer *rootLayer;
CAShapeLayer *lineLayer;
CGMutablePathRef path;
Run Code Online (Sandbox Code Playgroud)
path = CGPathCreateMutable();
CGPathMoveToPoint(path, nil, self.frame.size.width/2-100, 260);
CGPathAddLineToPoint(path, nil, self.frame.size.width/2+100.0, 260);
CGPathCloseSubpath(path);
self.rootLayer = [CALayer layer];
rootLayer.frame = self.bounds;
[self.layer addSublayer:rootLayer];
self.lineLayer = [CAShapeLayer layer];
[lineLayer setPath:path];
[lineLayer setFillColor:[UIColor redColor].CGColor];
[lineLayer setStrokeColor:[UIColor blueColor].CGColor];
[lineLayer setLineWidth:1.5];
[lineLayer setFillRule:kCAFillRuleNonZero];
[rootLayer addSublayer:lineLayer];
[self performSelector:@selector(startTotalLine) withObject:nil afterDelay:1.5];
- (void)startTotalLine
{
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"animatePath"];
[animation setDuration:3.5];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[animation setAutoreverses:NO];
[animation setFromValue:(id)path];
[animation setToValue:(id)path];
[lineLayer addAnimation:animation forKey:@"animatePath"];
}
Run Code Online (Sandbox Code Playgroud)
在startTotalLine调用方法之前绘制了该行.此外,该startTotalLine方法不会影响该行.
我想让它从右到左为线条图画设置动画.
我会用动画属性来做.
为了实现这一点,我将创建一个自定义CALayer类 - 让我们称之为LineLayer.定义startPoint属性和length属性.然后我将length属性配置为"动画".
该代码看起来如下所示:
// LineLayer.h
@interface LineLayer: CALayer
@property (nonatomic, assign) int length;
// This was omitted from the SO code snippet.
@property (nonatomic, assign) CGPoint startPoint;
@end
// LineLayer.m
@implementation LineLayer
@synthesize length = _length;
// This was omitted from the SO code snippet.
@synthesize startPoint= _startPoint;
- (id) initWithLayer:(id)layer
{
if(self = [super initWithLayer:layer])
{
if([layer isKindOfClass:[LineLayer class]])
{
// This bit is required for when we CA is interpolating the values.
LineLayer *other = (LineLayer*)layer;
self.length = other.length;
self.startPoint = other.startPoint; // This was omitted.
}
}
return self;
}
+ (BOOL)needsDisplayForKey:(NSString *)key
{
if ([key isEqualToString:@"length"]) {
return YES;
}
return [super needsDisplayForKey:key];
}
- (void) setLength:(int)newLength
{
if (newLength < 0) {
return; // Fail early.
}
_length = newLength;
[self setNeedsDisplay];
}
/*
This should have been drawInContext:(CGContextRef)context
- (void) drawRect:(CGRect) rect
*/
- (void) drawInContext:(CGContextRef)context
{
//...Do your regular drawing here.
// This was omitted from the SO code snippet.
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
CGContextSetLineWidth(context, 2);
CGContextMoveToPoint(context, _startPoint.x, _startPoint.y);
CGContextAddLineToPoint(context, _startPoint.x + _length, _startPoint.y);
CGContextStrokePath(context);
}
@end
Run Code Online (Sandbox Code Playgroud)
然后在您的视图控制器中,您可以LineLayer像这样使用:
- (void)viewDidLoad
{
[super viewDidLoad];
LineLayer *lineLayer = [LineLayer new];
// This was omitted from the SO code snippet.
lineLayer.frame = CGRectMake(0, 0, 320, 480);
[lineLayer setNeedsDisplay];
// ---
lineLayer.startPoint = CGPointMake(0, 100);
lineLayer.length = 0;
[self.view.layer addSublayer:lineLayer];
// Now animate the changes to the length property
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"length"];
anim.duration = 5; // Change should table about 5 mins.
anim.fromValue = [NSNumber numberWithInt:0];
anim.toValue = [NSNumber numberWithInt:200];
[lineLayer addAnimation:anim forKey:@"animateLength"];
lineLayer.length = 200;
//Do clean up below...
}
Run Code Online (Sandbox Code Playgroud)
快乐编码:)
我认为做你想要的最简单的方法是呈现一些 1.5 像素高度的 UIView 并为其宽度设置动画。如果我不清楚就问我。
我认为您的代码不起作用,因为您的变量path不是图层属性。阅读手册:
CABasicAnimation 为图层属性提供基本的单关键帧动画功能。
你在这里做了一些奇怪的事情:
[animation setFromValue:(id)path];
[animation setToValue:(id)path];
Run Code Online (Sandbox Code Playgroud)
编辑:我偶然发现了一篇文章,并理解您想要实现的目标!现在我认为你失败的原因是你可以为不改变点数的路径设置动画。现在我认为你可以创建一条有两点的路径线。起初它们位于同一个地方,而另一条路径是您想要结束的线。现在从第一条路径到第二条路径进行动画处理。我认为它应该有效,但我不确定。
编辑:当然!你需要这个人的密码。git 链接.
| 归档时间: |
|
| 查看次数: |
6055 次 |
| 最近记录: |