Синхронизация анимации UIView - PullRequest
7 голосов
/ 17 января 2011

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

Существует ли стандартный способ решения этой проблемы, предоставляемый платформой?Или я неправильно выполняю анимацию?

В настоящее время он проверяет флаг (animationInProgress), чтобы справиться с этим, но я хотел знать, к этому ли мы должны прибегать для этого?

Вот код:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    NSMutableArray *c = (NSMutableArray*)context;
    UINavigationController *nc = [c objectAtIndex:0];
    [nc.view removeFromSuperview];
    animationInProgress = NO;
}

- (void)transitionViews:(BOOL)topToBottom {
    if (animationInProgress) {
        return;
    }
    animationInProgress = YES;
    NSMutableArray *context = [[NSMutableArray alloc] init];
    [UIView beginAnimations:@"myanim" context:context];
    [UIView setAnimationDuration:0.7f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    UIViewController *from;
    UIViewController *to;
    if (navController3.view.superview == nil ) {
        from = navController2;
        to = navController3;
    } else {
        from = navController3;
        to = navController2;
    }

    int height;
    if (topToBottom) { 
        height = -1 * from.view.bounds.size.height;
    } else {
        height = from.view.bounds.size.height;
    }

    CGAffineTransform transform = from.view.transform;

    [UIView setAnimationsEnabled:NO];
    to.view.bounds = from.view.layer.bounds;
    to.view.transform = CGAffineTransformTranslate(transform, 0, height);
    [window addSubview:to.view];

    [UIView setAnimationsEnabled:YES];
    from.view.transform = CGAffineTransformTranslate(from.view.transform, 0, -1 * height);
    to.view.transform = transform;

    [context addObject:from];

    [UIView commitAnimations];

    return;
}

1 Ответ

10 голосов
/ 17 января 2011

Поведение фреймворков по умолчанию, как вы заметили, позволяет чему-либо происходить одновременно, если вы этого хотите.

Использование флага, как вы делаете, вполне разумно, если ваша цель - заблокировать конкретную анимацию, если она уже запущена.

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

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

в паре с:

[[UIApplication sharedApplication] endIgnoringInteractionEvents];
...