Проблемы с анимацией переворота между UIView и UIScrollView - PullRequest
0 голосов
/ 07 октября 2009

Я новичок в разработке для iPhone, и я пытаюсь сделать анимацию пролистывания между UIView и другим UIView, содержащим обычный UIView и UIScrollView, представление прокрутки в свою очередь имеет несколько UIViews в качестве подпредставлений.

Перед началом анимации представление прокрутки должно быть смещено к определенной точке, чтобы показать конкретное подпредставление (пользователь переходит к определенной «главе» в представлении прокрутки).

Это хорошая анимация, но проблема в том, что она «иногда» (возможно, каждый третий раз) запускает анимацию с одним из подпредставлений вида прокрутки вместо запуска анимации с исходным UIView («overlayView» в код ниже). Я подозреваю, что это связано с тем, что я установил смещение вида прокрутки перед анимацией.

Вот как я сейчас это делаю:

   // get the MPMoviePlayer window that has the views to animate between as subviews
   UIWindow *moviePlayerWindow = [[UIApplication sharedApplication] keyWindow];

    // tell the controller of the scroll view to set the scroll view offset
    [instructionControlsController setInstructionImageWithNumber:[self chapterAtTime:currentTime]];

    // Animate transition to instruction view
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.5];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView: moviePlayerWindow cache:NO];

    // the views to animate between
    [moviePlayerWindow sendSubviewToBack: overlayView];
    [moviePlayerWindow bringSubviewToFront: instructionControlsController.view];

    [UIView commitAnimations];

Метод setInstructionImageWithNumber в контроллере выглядит следующим образом:

- (void) setInstructionImageWithNumber:(int)number
{
    if (number < kNumberOfPages)
        [scrollView setContentOffset: CGPointMake((number * kImageWidth), 0) animated:NO];
}

Любые идеи о том, что я могу делать неправильно и почему я получаю такое поведение, когда анимация иногда выглядит хорошо, а иногда нет?

1 Ответ

2 голосов
/ 07 октября 2009

Что произойдет, если вы дадите циклу выполнения шанс обновить свое представление перед beginAnimations? Возможно, вам придется сделать это, чтобы дать представлению возможность «наверстать упущенное» и быть точно обновленным до начала анимации.

UIWindow *moviePlayerWindow = [[UIApplication sharedApplication] keyWindow];
[instructionControlsController setInstructionImageWithNumber:[self chapterAtTime:currentTime]];

//Before continuing the animation, let the views update
[self performSelector:@selector(continueTheAnimation:) withObject:nil afterDelay:0.0];

. , .

- (void)continueTheAnimation:(void*)context {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.5];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView: moviePlayerWindow cache:NO];
    [moviePlayerWindow sendSubviewToBack: overlayView];
    [moviePlayerWindow bringSubviewToFront: instructionControlsController.view];
    [UIView commitAnimations];
}
...