Почему мой CAGradientLayer оживляет все изменения? - PullRequest
1 голос
/ 22 октября 2011

У меня есть CAGradientLayer, который я хочу масштабировать, когда пользователь тащит туда палец.Однако, когда я устанавливаю кадр, слой анимируется до нового размера.Это происходит и с другими свойствами, включая start / endPoint.

Вот пример:

_gradient.frame = CGRectMake(0, 480-toHeight, 320, toHeight);

Тем не менее, если я вызову это только тогда, когда пользователь перетащил около 10 пикселей,Слой не просто переходит на новый размер, он анимируется с помощью плавной, но быстрой анимации.Я уверен, что это не вызывается в анимационном блоке.Для дальнейшей отладки я также анимирую фрейм UIView в той же области, и это не анимирует.

Я новичок в CALayers, поэтому, возможно, я делаю что-то неправильно.

Ответы [ 2 ]

10 голосов
/ 22 октября 2011

Большинство свойств CALayer по умолчанию анимированы. Вам необходимо отключить эти неявные анимации:

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
// change layer's properties
_gradient.frame = newFrame;
[CATransaction commit];

Вот хороший пример , который поможет вам в изучении базовой анимации.

3 голосов
/ 22 октября 2011

Из Руководства по программированию Core Animation:

"Изменение значения свойства анимируемого слоя заставляет слой неявно анимировать изменение от старого значения к новому значению."

Так что, если вы не хотите анимацию, вам нужно указать iOS не анимировать явно:

[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
_gradient.frame = CGRectMake(0, 480-toHeight, 320, toHeight);
[CATransaction commit];

удачи!

...