Получение плавного вращения с помощью распознавания жестов панорамирования
Я вращаю слой CATransform3D вокруг оси Y, принимая входные данные из UIPanGestureRecognizer:
CGPoint movement = [recognizer translationInView:self];
CGFloat trackSpread = self.bounds.size.width;
CGFloat angle = (35 * abs(movement.x))/trackSpread;
transform = CATransform3DRotate(transform, degToRad(angle), 0, 1, 0);
Представление вращается плавно, если панорамирование выполняется медленно, то есть получает непрерывные значения x от распознавателя, но если панорамирование происходит более быстрыми темпами, т.е. значения, получаемые от распознавателя, не являются непрерывными, я вижу скачки вращения (вроде как слой также переводит немного вокруг его точки вращения). Будет ли способ сохранить плавность вращения независимо от того, выполняется панорамирование медленно или быстро?
1 ответ
Автономные слои имеют неявную анимацию, которая происходит автоматически только путем изменения свойства. Это то, что вы видите. При постоянном обновлении свойства создается впечатление, что слой отстает и отстает.
Если вы хотите изменить свойство без неявной анимации, вы можете изменить его в транзакции, которая отключила все действия (более общее название для анимации):
[CATransaction begin];
[CATransaction setDisableActions:YES]; // no animations
myLayer.transform = newTransform;
[CATransaction commit];
Вы также можете настроить слой так, чтобы он никогда не искал анимацию для заданного ключевого пути, добавив NSNull
к его actions
словарь для этого ключевого пути:
myLayer.actions = @{
@"transform": [NSNull null] // never animate "transform"
};