多次移动视图

时间:2013-09-07 19:06:56

标签: ios objective-c view uiviewanimation

我得到一个数组“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];
    }
}

抱歉我的英文不好:)

2 个答案:

答案 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

如果您正在使用自动布局,请不要忘记在完成后重置此视图的约束。