计时器动画的问题

时间:2011-07-25 10:23:23

标签: iphone xcode animation timer uiimageview

这是我想做的事http://www.youtube.com/watch?v=rD3MTTPaK98 我已经完成了图像出现在随机位置的部分,但随后它变得很难。我不想使用UIKit Animations,因为我使用一个定时器来动画像:imageView.center = CGPointMake(imageView.center.x + X,imageView.center.y + Y);但是我不能一次动画多个图像我不知道为什么?我该如何解决呢

这是我的代码:

-(void) onTimer {


UIImage * image = [UIImage imageNamed:@"abouffer_03.png"];
imageView = [[UIImageView alloc] initWithImage:image];

[imageView setCenter:[self randomPointSquare]];


[[self view] addSubview:imageView];

[imageView release];

ix=imageView.center.x;
iy=imageView.center.y;

X=(240-ix)/230;
Y=(160-iy)/230;
coteA=(240-ix);
coteB=(160-iy);
angleDeRotation=atan(coteB/coteA);
if(ix>250||0>iy>320){
    imageView.transform = CGAffineTransformMakeRotation(angleDeRotation+3.14);
}
else{
imageView.transform = CGAffineTransformMakeRotation(angleDeRotation);
}
}



-(void)onTimer2{
        imageView.center = CGPointMake(imageView.center.x + X, imageView.center.y + Y);
label.text= [NSString stringWithFormat:@"%d", count];

2 个答案:

答案 0 :(得分:1)

由于您未在此处发布所有代码,因此我必须猜测。

您是否在onTimer中创建了imageView,然后尝试在onTimer2中移动“他们”?

如果是,那么

因为您总是将imageView var设置为您在onTimer方法中创建的最新imageView,所以当您尝试在imageView方法中移动onTimer2时,您只是移动你创建的最新版本。

为了移动您创建的每个imageView,您最好在for loop方法中使用onTimer2

另外,您最好使NSMutableArray保存所有的imageView,或者您可以使用imageView.tag再次获取imageView,而无需创建NSMutableArray并稍后将其释放。

以下是如何使用NSMutableArray保存和读取所有imageView的示例:

将其添加到班级的.h文件中:

NSMutableArray *views;
NSMutableArray *XArray;
NSMutableArray *YArray;

修改您的.m文件:

...
    //Create an array some where in your class:
    views = [[NSMutableArray array] retain];
    XArray = [[NSMutableArray array] retain];
    YArray = [[NSMutableArray array] retain];
...

- (void)onTimer {
    [XArray addObject:[NSNumber numberWithFloat:(240.0f - ix)/230.0f]];
    [YArray addObject:[NSNumber numberWithFloat:(160.0f - iy)/230.0f]];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]];
    [self.view addSubview:imageView];
    [views addObject:imageView];
    [imageView release];
}

//Read:
- (void)onTimer2 {
    for (NSUInteger i = 0; i < [views count]; i++) {
         UIImageView *imageView = [views objectAtIndex:i];
         CGFloat X = [[XArray objectAtIndex:i] floatValue];
         CGFloat Y = [[YArray objectAtIndex:i] floatValue];
         CGPointMake(imageView.center.x + X, imageView.center.y + Y);
    }
} 

- (void)dealloc {
    ...
    [views release];
    [XArray release];
    [YArray release];
    ...
}

或者您可以像这样使用imageView.tag

将其添加到班级的.h文件中:

NSInteger imageViewCount;

修改您的.m文件:

...
#define kImageViewFirstTag       10000
...

...
    //reset the count some where in your class if needed
    imageViewCount = 0;
...

- (void)onTimer {
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]];
    [self.view addSubview:imageView];
    [views addObject:imageView];
    imageView.tag = kImageViewFirstTag + imageViewCount;
    imageViewCount ++;
    [imageView release];
}


//Read:
- (void)onTimer2 {
    for (NSUInteger i = 0; i < imageViewCount; i++) {
         UIImageView *imageView = (UIImageView *)[self.view viewWithTag:kImageViewFirstTag + i];
         CGPointMake(imageView.center.x + X, imageView.center.y + Y);
    }
}

这两个代码是由大脑编译的,如果有任何错误,请纠正我。

建议使用第一种方法,因为它具有更好的性能。

答案 1 :(得分:0)

每次调用imageView时,您都会覆盖您的ivar -onTimer。您应该将每个创建的imageview放在一个数组或一个集合中,或者您可以根据您的视图结构迭代self.view.subviews