Почему `transform.rotation` доступен для CoreAnimation, но недоступен с помощью геттера? - PullRequest
0 голосов
/ 03 июля 2018

Я вижу много кода, который поворачивает вид следующим образом:

CABasicAnimation *centerToRightRotate
    = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
centerToRightRotate.fromValue = @(0);
centerToRightRotate.toValue = @(M_PI/8);
centerToRightRotate.duration = 0.15;

[self.view.layer addAnimation:centerToRightRotate forKey:nil];

(например, многие ответы на на этот вопрос )

Тем не менее, когда я пытаюсь получить доступ к self.view.layer.transform.rotation или self.view.layer.transform.rotation.z, компилятор скажет мне: «В CATransform3D нет члена с именем 'принуждение". Документы для CATransform3D также не показывают rotation в качестве свойства экземпляра.

Я предполагаю, что CAAnimation каким-то образом переводит ключевой путь transform.rotation в соответствующее преобразование, но я хочу знать, что на самом деле происходит под капотом. Что именно здесь происходит?

1 Ответ

0 голосов
/ 03 июля 2018

Согласно Расширения кодирования значения ключа

Базовая анимация расширяет протокол NSKeyValueCoding, поскольку он относится к классам CAAnimation и CALayer. Это расширение добавляет значения по умолчанию для некоторых ключей, расширяет соглашения об упаковке и добавляет поддержку пути к ключам для типов CGPoint, CGRect, CGSize и CATransform3D.

rotation не является собственностью CATransform3D. Поддерживается ключевой путь для указания поля структуры данных, которое вы хотите анимировать удобным способом.

Вы также можете использовать эти соглашения в сочетании с методами setValue: forKeyPath: и valueForKeyPath: для установки и получения этих полей.

Установка значений с использованием ключевых путей не совпадает с установкой их с помощью свойств Objective-C. Вы не можете использовать нотацию свойств для установки значений преобразования. Вы должны использовать setValue: forKeyPath: метод с предыдущими строками ключа.

Вы можете использовать setValue:forKeyPath:, valueForKeyPath:, чтобы установить или получить его, но не можете использовать нотацию свойства.

Если вы хотите узнать, что на самом деле происходит под капотом, узнайте больше о NSKeyValueCoding здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...