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] также помогло мне в подобных ситуациях.