Это общая точка смешения с Core Animation.A CAAnimation
на самом деле не меняет базовые «модельные» свойства слоя.Это просто меняет внешний вид слоя для пользователя.Таким образом, ваш toValue
никогда не устанавливается на вашем слое, и вам нужно сделать это самостоятельно.Вы можете сделать это прямо до или после запуска анимации.Ваше новое значение будет установлено, но пользователь не увидит его, пока анимация не закончится.Придуманный пример:
CABasicAnimation *rotate = [CABasicAnimation animationWithKeyPath:@"transform"];
rotate.fromValue = [NSValue valueWithCATransform3D:myLayer.transform];
rotate.toValue = [NSValue valueWithCATransform3D:CATransform3DRotate(myLayer.transform, M_PI, 0.f, 0.f, 1.f)];
rotate.duration = .5f;
myLayer.transform = CATransform3DRotate(myLayer.transform, M_PI, 0.f, 0.f, 1.f);
[myLayer addAnimation:rotate forKey:@"transform"];
Два важных элемента - установка свойства слоя и использование имени свойства в качестве ключа в addAnimation:forKey:
.Не беспокойтесь о неявной анимации.Внутри CALayer
хранит все свои анимации в словаре с ключами от имен свойств, а при добавлении новой анимации отменяет и заменяет любую существующую анимацию для указанного ключа / свойства.Я не могу сказать, нужна ли вам помощь с жестом смахивания или нет, но вы должны проверить UIPanGestureRecognizer
, если вы еще этого не сделали.Он предоставляет удобный метод velocityInView:
, который даст вам двухмерный вектор в направлении панорамирования, выраженный в точках в секунду.У меня есть пример кода распознавателя жестов на github , который может помочь.