проблема с анимацией таймера - PullRequest
2 голосов
/ 25 июля 2011

вот что я хочу сделать http://www.youtube.com/watch?v=rD3MTTPaK98 Я выполнил ту часть, где изображение появляется в случайном положении, но потом мне стало трудно.Я не хочу использовать анимацию UIKit, потому что я использую таймер для анимации, например: 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 ]

1 голос
/ 21 августа 2011

Поскольку вы не публикуете здесь весь свой код, я должен догадаться.

Вы создаете imageView в onTimer, а затем пытаетесь переместить «их» в onTimer2?

Если ДА, то

Поскольку вы всегда устанавливаете переменную imageView для последнего изображения, созданного вами в методе onTimer, при попытке переместить метод imageView в onTimer2 выВы перемещаете только последний созданный вами файл.

Чтобы переместить каждый созданный вами imageView, вам лучше иметь for loop в вашем методе onTimer2.

Дополнительновам лучше создать NSMutableArray, чтобы сохранить все ваши imageViews, или вы можете использовать imageView.tag, чтобы снова получить ваш imageView без необходимости создавать NSMutableArray и выпускать его позже.

Вот пример того, как использоватьNSMutableArray для сохранения и чтения всех ваших изображений:

Добавьте это в файл .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 file:

NSInteger imageViewCount;

Отредактируйте .m file:

...
#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);
    }
}

Два кода скомпилированы мозгом, исправьте меня, если есть какой-либо опечатка.

Рекомендуется первый способ, потому что он имеет лучшую производительность.

0 голосов
/ 21 августа 2011

Вы перезаписываете свой ivar imageView каждый раз, когда вызывается -onTimer.Вы, вероятно, должны поместить каждое созданное изображение в массив или набор, или вы можете в зависимости от вашей структуры просмотра перебрать self.view.subviews.

...