我得到一个数组“coordList”,其数组包含x-y坐标 我想沿着这些坐标移动一个视图。
如果您有更好的方法,请告诉我该怎么做。
我这样做有一个很大的问题。它直接跳到最后一个动画,我知道为什么,但不知道如何解决它。
我的代码:
count = 1;
for(NSArray *array in coordList) {
[UIView animteWithDuration:1 animations:^(void){
CGRect r = [[self.subviews lastObject] frame];
r.origin.x = 103*[coordList[count][0]integerValue];
r.origin.y = 103*[coordList[count][1]integerValue];
[[self.subviews lastObject] setFrame:r];
count++;
[UIView commitAnimations];
}
}
抱歉我的英文不好:)
答案 0 :(得分:0)
发生的事情是您要为同一视图提交多个动画,因此每次为该视图提交新动画时,它都会覆盖其他现有动画。
您需要设置动画以逐个触发。所以一个简单的for循环不会那么好。
我建议这样的递归例程:
//set a property to keep current count
@property (nonatomic, asssign) NSInteger currentFrame;
//initialize it to 0 on init
currentFrame = 0;
//call this once when ready to animate
[self animationWithCurrentFrame];
//it will call this routine once for each array.
- (void)animationWithCurrentFrame {
__block NSArray *array = [coordList objectAtIndex:currentFrame];
[UIView animateWithDuration:2.0
animations:^{
CGRect r = [[self.subviews lastObject] frame];
r.origin.x = 103*[array[0]integerValue];
r.origin.y = 103*[array[1]integerValue];
[[self.subviews lastObject] setFrame:r];
}
completion:^(BOOL finished){
currentFrame++;
if (currentFrame < [coordList count]) {
[self animationWithCurrentFrame];
}
}];
}
答案 1 :(得分:0)
这是CAKeyFrameAnimation
的理想应用。你不做一堆动画,而是你定义一个路径,然后执行一个动画,将该路径指定为“位置”:
UIView *viewToAnimate = [self.subviews lastObject];
// create UIBezierPath for your `coordList` array
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(103*[coordList[0][0]integerValue], 103*[coordList[0][1]integerValue])];
for (NSInteger i = 1; i < [coordList count]; i++)
{
[path moveToPoint:CGPointMake(103*[coordList[i][0]integerValue], 103*[coordList[i][1]integerValue])];
}
// now create animation
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.path = [path CGPath];
animation.duration = 2.0;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
[viewToAnimate.layer addAnimation:animation forKey:@"position"];
为此,您必须将QuartzCore框架添加到项目中,并在.m文件的顶部导入相应的标题:
#import <QuartzCore/QuartzCore.h>
有关详细信息,请参阅核心动画编程指南中的Keyframe Animation to Change Layer Properties。
如果您正在使用自动布局,请不要忘记在完成后重置此视图的约束。