Запуск другой анимации после первого завершения анимации (Objective-C) - PullRequest
3 голосов
/ 26 апреля 2010

У меня есть простая анимация, которая просто изменяет положение кнопки:

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

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

Ответы [ 4 ]

5 голосов
/ 26 апреля 2010

Вы можете посмотреть на 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 голос
/ 18 декабря 2010

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

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

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

Вы можете легко зациклить анимацию.

Чтобы закончить, я бы создал animationDidEnded и использовал его вместо animationDidContiune. как только вы захотите остановить его (например, просто, если в анимации выбрано продолжение или конец).

ВЧ.

И ЧТО ВАЖНО:

используйте этот тип анимации:

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

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

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

1 голос
/ 26 апреля 2010

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

- (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];          
    }
}
1 голос
/ 26 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...