CATransaction: проблемы при реализации анимации перелистывания страниц

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

Мой код выглядит так:

[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 ответ

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

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

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

Другие вопросы по тегам