Анимация свойства shadowPath CALayer

Я знаю, что 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 не может генерировать неявные анимации ... так как мне получить новое свойство остаться после анимации?

9
задан Stuart 8 May 2011 в 17:22
поделиться