2009-09-26 3 views
0

Вот мой код для того, чтобы сделать летучую мышь крыльями и ответить на прикосновения.Помогите перекрыть анимацию?

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSArray * imageArray = [[NSArray alloc] initWithObjects: 
          [UIImage imageNamed:@"Bat1.png"], 
          [UIImage imageNamed:@"Bat2.png"], 
          [UIImage imageNamed:@"Bat3.png"], 
          [UIImage imageNamed:@"Bat2.png"], 
          [UIImage imageNamed:@"Bat1.png"], 
          [UIImage imageNamed:@"Bat4.png"], 
          [UIImage imageNamed:@"Bat5.png"], 
          [UIImage imageNamed:@"Bat6.png"], 
          [UIImage imageNamed:@"Bat5.png"], 
          [UIImage imageNamed:@"Bat4.png"], 
          nil]; 

    UIImageView * batView = [[UIImageView alloc] initWithFrame: 
          CGRectMake(0, 0, 80, 56)]; 
    batView.animationImages = imageArray; 
    batView.animationDuration = 0.70; 
    [follower1 addSubview:batView]; 
    [batView startAnimating]; 
    [UIImageView beginAnimations:@"follow" context:nil]; 
    [UIImageView setAnimationDuration:1]; 
    [UIImageView setAnimationBeginsFromCurrentState:YES]; 
    UITouch *touch = [touches anyObject]; 
    follower1.center = [touch locationInView:self]; 
    [UIImageView commitAnimations]; 
    [batView release]; 
} 

Проблема заключается в том, что после второго прикосновения анимации накладываются друг на друга так, после каждого прикосновения она выглядит как есть много летучих мышей под ним!

ответ

1

Это происходит потому, что вы добавляете новый batView каждый раз при наступлении касания.

Один из способов исправить это заключается в том, чтобы добавить batView один раз, например, в режиме наблюдения или контроллера вида init. Если вы хотите только batView появляться, когда прикосновение происходит, вы можете запустить его скрыт с помощью:

// during initialization 
batView.hidden = YES; 

Поскольку вы всегда делаете то же анимацию каждый раз, вы можете также настроить параметры анимации на то же время, вместо того чтобы повторять тот же набор с каждым прикосновением:

// still during initialization 
NSArray* imageArray = /* set up your image array */; 
batView.animationImages = imageArray; 
batView.animationDuration = 0.7; 

Теперь, когда прикосновение происходит, вы можете справиться с этим запуском анимации:

// Within touchesBegan: 
    ... 
    // Start the batView animation. 
    batView.hidden = NO; 
    if (![batView isAnimating]) [batView startAnimating]; 
    // Hide the animation when it's done. 
    [self performSelector:@selector(hideBat) withObject:nil afterDelay:0.71]; 
} 

// Later: 

- (void) hideBat { batView.hidden = YES; } 

Возможно, вы захотите сделать что-то другое в hideBat, если вы не всегда хотите, чтобы он исчез сразу после одной анимации. Например, если вы хотите всегда повторять анимацию до тех пор, пока пользователь не перестанет щелкать, вы можете настроить объект NSTimer, чтобы он исчез, как только пользователь не коснулся не менее 0,7 секунды. Каждый раз, когда пользователь снова коснется экрана, вы можете сбросить этот таймер.

Ссылка: UIImageView docs, которая включает краткие описания методов анимации.

Смежные вопросы