Моя анимация с завершением, блок завершения выполняется только один раз - PullRequest
4 голосов
/ 31 марта 2012

Я использую следующий блок кода, чтобы сдвинуть UIView вниз и, когда закончите, повернуть другой UIView. Вторая часть анимации, блок завершения выполняется только один раз, что означает, что 1-я анимация не завершена, иначе она достигнет блока завершения. На симуляторе iphone выглядит так, как будто первая анимация закончилась ... Может ли кто-нибудь помочь мне понять это? мой NSLog говорит:

закончил 1-й

начало 2-го

закончил 1-й

закончил 1-й

закончил 1-й
.
.
,

- (IBAction) move 
{ 
[UIView animateWithDuration:0.7 animations:^{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.7];
    [UIView setAnimationRepeatCount:1];
    [UIView setAnimationRepeatAutoreverses:NO];

    CGPoint pos = movingtTable.center;
    float moveDistance = 220.0;
    if(!isViewVisible){
        //expose the view
        pos.y = pos.y+moveDistance;
        //disable selection for xy table
        xTable.userInteractionEnabled = NO;
        yTable.userInteractionEnabled = NO;
        //angle = M_PI;
    }
    else
    {
        pos.y = pos.y-moveDistance;
        xTable.userInteractionEnabled = YES;
        yTable.userInteractionEnabled = YES;
        //angle = -M_PI;
    }
    isViewVisible = !isViewVisible;
    movingtTable.center = pos;      
    NSLog(@"finished 1st");


}completion:^(BOOL finished){
    NSLog(@"started 2nd");
        [UIView animateWithDuration:0.4 animations:^{
            //[UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:0.4];
            //[UIView setAnimationRepeatCount:1];
            //[UIView setAnimationRepeatAutoreverses:NO];
            arrows.transform = CGAffineTransformMakeRotation(angle); 
         }completion:^(BOOL finished){
             angle = -angle;
         }];
}];

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

Вы смешиваете и подбираете парадигмы, и я считаю, что это вызывает проблему, которую вы видите. Вы создаете блок анимации, но внутри этого блока вы создаете новую подпрограмму анимации со «старой» парадигмой для запуска анимаций UIView. Apple уводит людей от старой парадигмы, и я бы посоветовал вам использовать ТОЛЬКО блоки.

Вот почему блок завершения запускается только один раз, код блока UIView animateWith запускается только один раз. Однако ваш внутренний код анимации запускается несколько раз.

Вынуть:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.7];
[UIView setAnimationRepeatCount:1];
[UIView setAnimationRepeatAutoreverses:NO];

Если вы хотите, чтобы ваш анимационный блок запускался несколько раз, используйте полный метод:

  • animateWithDuration: Задержка: опции: анимация: завершение:

Установите задержку = 0 и установите для своих параметров значение UIViewAnimationOptionRepeat, или все, что вам нужно для достижения количества циклов, которое вы хотите, чтобы блок завершил.

Вот мое предложение, если вы хотите, чтобы оно повторилось:

- (IBAction) move 
{ 
[UIView animateWithDuration:0.7 
                      delay:0 
                    options:UIViewAnimationOptionRepeat 
                 animations:^{
                               CGPoint pos = movingtTable.center;
                               float moveDistance = 220.0;

                               if(!isViewVisible) {
                                 //expose the view
                                 pos.y = pos.y+moveDistance;
                                 //disable selection for xy table
                                 xTable.userInteractionEnabled = NO;
                                 yTable.userInteractionEnabled = NO;
                                 //angle = M_PI;
                               }
                               else {
                                 pos.y = pos.y-moveDistance;
                                 xTable.userInteractionEnabled = YES;
                                 yTable.userInteractionEnabled = YES;
                                 //angle = -M_PI;
                               }
                               isViewVisible = !isViewVisible;
                               movingtTable.center = pos;      
                               NSLog(@"finished 1st");
                             }
                completion:^(BOOL finished){
                               NSLog(@"started 2nd");
                               [UIView animateWithDuration:0.4 
                                                animations:^{
                                                               arrows.transform = CGAffineTransformMakeRotation(angle); 
                                                            }
                                                completion:^(BOOL finished){
                                                               angle = -angle;
                                                            }];
                             }];
}
2 голосов
/ 31 марта 2012

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

- (IBAction) move 
{ 
[UIView animateWithDuration:0.7 animations:^{
    CGPoint pos = movingtTable.center;
    float moveDistance = 220.0;
    if(!isViewVisible){
        //expose the view
        pos.y = pos.y+moveDistance;
        //disable selection for xy table
        xTable.userInteractionEnabled = NO;
        yTable.userInteractionEnabled = NO;
        //angle = M_PI;
    }
    else
    {
        pos.y = pos.y-moveDistance;
        xTable.userInteractionEnabled = YES;
        yTable.userInteractionEnabled = YES;
        //angle = -M_PI;
    }
    isViewVisible = !isViewVisible;
    movingtTable.center = pos;      
    NSLog(@"finished 1st");
}
completion:^(BOOL finished){
    NSLog(@"started 2nd");
        [UIView animateWithDuration:0.4 animations:^{
            arrows.transform = CGAffineTransformMakeRotation(angle); 
         }completion:^(BOOL finished){
             angle = -angle;
         }];
}];

Кстати: код блока требует серьезного рефакторинга, если вы спросите меня:)

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