Я знаю, что shadowPath CALayer можно анимировать только с использованием явной анимации, однако я все еще не могу заставить это работать. Я подозреваю, что я неправильно передаю toValue
- насколько я понимаю, это должен быть id
, однако свойство принимает CGPathRef. Сохранение этого в UIBezierPath
, похоже, не работает. Я использую следующий код для тестирования:
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
theAnimation.duration = 3.0;
theAnimation.toValue = [UIBezierPath bezierPathWithRect:CGRectMake(-10.0, -10.0, 50.0, 50.0)];
[self.view.layer addAnimation:theAnimation forKey:@"animateShadowPath"];
(я использую отрицательные значения, чтобы гарантировать, что тень выходит за пределы вида, лежащего поверх нее ... свойство слоя masksToBounds
установлено на НЕТ
).
Как достигается анимация shadowPath?
ОБНОВЛЕНИЕ
Проблема почти решена. К сожалению, основная проблема была несколько небрежной ошибкой ...
Я сделал ошибку, добавив анимацию к корневому слою контроллера представления, а не к слою, который я выделил для тени. Кроме того, @ pe8ter был правильным в том смысле, что toValue
должен быть преобразованием CGPathRef
в id
(очевидно, когда я пробовал это до того, как у меня все еще не было анимации из-за к ошибке неправильного слоя). Анимация работает со следующим кодом:
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
theAnimation.duration = 3.0;
theAnimation.toValue = (id)[UIBezierPath bezierPathWithRect:myRect].CGPath;
[controller.shadowLayer addAnimation:theAnimation forKey:@"shadowPath"];
Я понимаю, что это было трудно определить из предоставленного мной образца кода. Надеюсь, он все еще может быть полезен людям в подобной ситуации.
Однако, когда я пытаюсь добавить строку
controller.shadowLayer.shadowPath = [UIBezierPath bezierPathWithRect:myRect].CGPath;
, анимация перестает работать, и тень мгновенно перескакивает в конечную позицию. Документы говорят, что нужно добавить анимацию с тем же ключом, что и изменяемое свойство, чтобы переопределить неявную анимацию, созданную при установке значения свойства, однако shadowPath не может генерировать неявные анимации ... так как мне получить новое свойство остаться после анимации?