2010-04-26 2 views
3

У меня есть простая анимация, которая просто изменить положение кнопки:Запуска другой анимации после первого окончания анимации (Objective-C)

[UIView beginAnimation:nil context:nil]; 
[UIView setAnimationsDuration:3.0]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
mybutton.frame = CGREctMake(20, 233, 280, 46); 
[UIView commitAnimations]; 

Я хочу, чтобы выполнить некоторые другие анимации, когда это один конец, как сделать это?

ответ

1

сегмент кода для получения запуска .. установки начальной (первой) анимации:

- (void) aniPath:(AnimationPath *) path 
{ 
    [UIView beginAnimations:path->aniname context:path]; 
    [UIView setAnimationDuration:path->interval]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(aniDone:finished:context:)]; 

    // your initial animation 

    [UIView commitAnimations]; 
} 

Цепи на другую анимацию, когда первый делается:

- (void) aniDone:(NSString *) aniname finished:(BOOL) finished context:(void *) context 
{ 
    AnimationPath *path = (AnimationPath *) context; 
    if ([aniname isEqualToString:path->aniname]) { 
     [UIView beginAnimations:path->aniname context:context]; 
     [UIView setAnimationDuration:path->interval]; 
     [UIView setAnimationDelegate:self]; 
     [UIView setAnimationDidStopSelector:@selector(aniDone:finished:context:)]; 

     // more animations, even recursively 

     [UIView commitAnimations];   
    } 
} 
+0

Что такое 'AnimationPath', и почему вы используете на нем' -> '? Если AnimationPath является классом Objective-C, вы определенно не должны использовать '->'. Вы никогда не должны обращаться к ivar из-за пределов самого класса, если у вас нет по-настоящему веской причины. Вы должны создать методы доступа или использовать свойства Obj-C и использовать их для доступа к 'aniname' и' interval'. –

+0

AnimationPath - это моя собственная структура для координации пути анимации. Вы можете смело игнорировать его или заменять своей собственной структурой данных. – ohho

1

Используйте методы [UIVIew setAnimationDelegate:] и [UIView setAnimationDidStopSelector:], чтобы настроить класс для получения сообщения, когда анимация заканчивается.

5

Вы можете посмотреть setAnimationBeginsFromCurrentState:. Все анимации запускаются в их собственных потоках, поэтому [UIView commitAnimations] является неблокирующим вызовом. Итак, если вы начнете новую анимацию сразу после первой записи, после правильной установки, начнется ли она с текущего состояния, я думаю, вы получите нужное поведение. А именно:

[UIView beginAnimation:nil context:nil]; 
// set up the first animation 
[UIView commitAnimations]; 

[UIView beginAnimation:nil context:nil]; 
[UIView setAnimationBeginsFromCurrentState:NO]; 
// set up the second animation 
[UIView commitAnimations]; 

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

[UIView beginAnimation:nil context:nil]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:) 
// set up the first animation 
[UIView commitAnimations]; 

//... 

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 
    // set up the second animation here 
} 
1

это довольно просто.

вы можете просто

- (void)animationDidContiune:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 
    UIView *currentObj = context; 
    [self callTheAnimation: currentObj]; 
} 

вы можете легко цикл анимации.

Чтобы закончить его - я бы создал анимациюDidEnded и использовал ее вместо анимацииDidContiune , как только вы захотите ее остановить (например, просто, если в анимации, которая выбирает либо contiune, либо end).

HF.

И что важно:

использовать этот тип оживляющий денатурат:

- (void)callTheAnimation:(UIView*)itemView 
{ 

    [UIView beginAnimations:@"animation" context:itemView]; 
     . 
     . 
     . 
} 

они являются достаточно гибкими - можно анимировать все, что здесь из-за иерархии объектов.