CAAnimation 期间的位置
Posted
技术标签:
【中文标题】CAAnimation 期间的位置【英文标题】:Position during a CAAnimation 【发布时间】:2013-12-23 09:58:46 【问题描述】:我正在使用它沿路径为对象设置动画。我想知道如何在动画期间的任何时候获取对象的位置,以检查与另一个对象的碰撞。任何想法如何去做?谢谢。
- (void) animateCicleAlongPath
//Prepare the animation - we use keyframe animation for animations of this complexity
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.calculationMode = kCAAnimationCubic;
[pathAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO;
pathAnimation.duration = 7.0;
//Lets loop continuously for the demonstration
pathAnimation.repeatCount = 1;
//Setup the path for the animation - this is very similar as the code the draw the line
//instead of drawing to the graphics context, instead we draw lines on a CGPathRef
CGPoint endPoint = CGPointMake(endpointx, endpointy);
CGMutablePathRef curvedPath = CGPathCreateMutable();
CGPathMoveToPoint(curvedPath, NULL,startpointx,startpointy);
// CGPathMoveToPoint(curvedPath, NULL, 10, 10);
CGPathAddQuadCurveToPoint(curvedPath,NULL, controlpointx, controlpointy, endpointx, endpointy);
//Now we have the path, we tell the animation we want to use this path - then we release the path
pathAnimation.path = curvedPath;
CGPathRelease(curvedPath);
//We will now draw a circle at the start of the path which we will animate to follow the path
//We use the same technique as before to draw to a bitmap context and then eventually create
//a UIImageView which we add to our view
UIGraphicsBeginImageContext(CGSizeMake(20,20));
CGContextRef ctx = UIGraphicsGetCurrentContext();
//Set context variables
CGContextSetLineWidth(ctx, 1.5);
CGContextSetFillColorWithColor(ctx, [UIColor greenColor].CGColor);
CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor);
//Draw a circle - and paint it with a different outline (white) and fill color (green)
CGContextAddEllipseInRect(ctx, CGRectMake(1, 1, 18, 18));
CGContextDrawPath(ctx, kCGPathFillStroke);
UIImage *circle = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *circleView = [[UIImageView alloc] initWithImage:circle];
circleView.frame = CGRectMake(1, 1, 20, 20);
[throwingView addSubview:circleView];
//Add the animation to the circleView - once you add the animation to the layer, the animation starts
[circleView.layer addAnimation:pathAnimation forKey:@"moveTheSquare"];
【问题讨论】:
在现代 Swift 中,您正在寻找thatLayer.presentation()
【参考方案1】:
我相信你这里有两个问题:
检查碰撞 找出验证碰撞的位置检查碰撞
CALayer
有一个模型层和一个表示层。表示层为您提供所需的视觉信息。基本上,该层负责获取有关该层在屏幕上的位置的信息。你可以搞定:circleView.layer.presentationLayer
找出验证碰撞的位置
您可以使用每 1/60 秒运行一次的 NSTimer
来执行此操作。但是,这不是一个好的解决方案,因为NSTimer
仅保证执行选择器所需的最少 时间。这样,您就可以在对象已经碰撞后检查碰撞情况。
但是,您可以使用CADisplayLink。这样,您将在图层在屏幕中呈现之前收到调用。
【讨论】:
是的,这就是我刚刚发现的。我运行了一个 NSTimer... animated.frame = [[animated.layer presentationLayer] frame];我会看看 CADDisplayLink 谢谢。 您也可以查看 Nick 的 Lockwood 书籍,了解高级核心动画。 :) 那本书太棒了:)。感谢您推荐它@JackyBoy @TiagoAlmeida "..NSTimer 只保证执行选择器所需的最短时间.." 你能告诉我更多信息吗?提前致谢。 @Unheilig 当您使用 NSTimer 时,您会说“在 X 秒后执行此选择器”。您不会说“在 X 秒内执行此选择器”。每个线程都有一个主 NSRunloop。此 NSRunLoop 执行一组任务,您的 NSTimer 将插入该列表中。但是,您无法保证每个任务将花费的时间,包括您的 NSTimer(尽管可以保证它至少需要您定义的秒数)以上是关于CAAnimation 期间的位置的主要内容,如果未能解决你的问题,请参考以下文章
CAAnimation 正在覆盖以前的 CAAnimation 动画
停止 CAAnimation 以添加另一个 CAAnimation