CATransaction: проблемы при реализации анимации перелистывания страниц - PullRequest
1 голос
/ 26 ноября 2011

Я пытаюсь реализовать анимацию перелистывания страниц, которая работает, когда пользователь не слишком быстро перемещается по страницам.

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

[CATransaction begin];
[CATransaction setAnimationDuration:duration];
[CATransaction setCompletionBlock:^{
    if (pageDifference == 1 && setDelegate) {
        [self cleanupFlip];
        self.animationInProgress = NO;
    }
}];
flipAnimationLayer.transform = endTransform;
[CATransaction commit];

endTransform - это CATransform3DIdentity, который, как я уже сказал, отлично работает.В моем cleanupFlip я готовлю скриншот для следующей страницы, который позволяет мне выполнять анимацию перелистывания страниц.И скриншот, который я делаю, кажется, проблема;как только пользователь нажимает для быстрого перехода по страницам, анимация не происходит, но страницы просто меняются - без анимации перелистывания страниц.Я получил улучшение, установив флаг animationInProgress, который позволяет избежать запуска следующей анимации до того, как старая закончится.

Чего я не получаю: я ожидаю, что это будет работать нормально, так как я устанавливаюanimationInProgress флаг в самом конце анимации, поэтому все должно быть подготовлено к следующему запуску - но это не так ...

На симуляторе я могу щелкнуть быстрее, чем на устройстве - там япридется подождать секунду, пока я не смогу начать следующий поворот страницы.

Без создания снимка экрана (например, просто с использованием пустого изображения) все работает как положено.Кажется, что это проблема, если cleanupFlip занимает некоторое время.

Есть идеи, как мне сделать эту работу?

Спасибо большое!

1 Ответ

0 голосов
/ 14 февраля 2012

Наиболее вероятной причиной такого поведения является то, что пользователь работает быстрее, чем анимация. То есть вторая [CATransaction begin] запускается до завершения первой анимации, и, следовательно, до того, как ваш setCompletionBlock будет выполнен. Я не уверен, каков точный порядок, но установка некоторых операторов NSLog в вашем коде должна прояснить это.

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

Помещение [сброса CATransaction] непосредственно перед началом [CATransaction begin] также помогло мне в подобных ситуациях.

...