tl; др: Радиус угла не анимируется в animateWithDuration:animations:
.
Что говорится в документации об анимации вида.
Как указано в разделе «Анимации» в «Руководстве по программированию для iOS»,
И UIKit, и Core Animation обеспечивают поддержку анимаций, но уровень поддержки, предоставляемый каждой технологией, варьируется. В UIKit анимация выполняется с использованием объектов UIView
Полный список свойств , которые можно анимировать с помощью более старых
[UIView beginAnimations:context:];
[UIView setAnimationDuration:];
// Change properties here...
[UIView commitAnimations];
или новее
[UIView animateWithDuration:animations:];
(которые вы используете):
- рама
- оценка
- центр
- transform (CGAffineTransform, а не CATransform3D)
- альфа
- BackgroundColor
- contentStretch
Как видите, cornerRadius
нет в списке.
Некоторая путаница
Анимации UIView действительно предназначены только для анимации свойств вида. Что смущает людей, так это то, что вы также можете анимировать те же свойства на слое внутри блока анимации UIView, то есть рамку, границы, положение, прозрачность, backgroundColor. Таким образом, люди видят анимацию слоя внутри animateWithDuration
и верят, что они могут анимировать любое свойство представления там.
В том же разделе говорится:
В местах, где вы хотите выполнять более сложные анимации или анимации, не поддерживаемые классом UIView, вы можете использовать Core Animation и базовый слой представления для создания анимации. Поскольку объекты вида и слоя сложно связаны друг с другом, изменения в слое вида влияют на сам вид.
Несколько строк внизу вы можете прочитать список анимируемых свойств Core Animation, где вы видите это:
- Граница слоя (включая то, закруглены ли углы слоя)
Итак, для анимации cornerRadius
вам нужно , чтобы использовать Core Animation, как вы уже сказали в своем обновленном вопросе (и ответе). Я только добавил, пытался объяснить, почему это так.
Некоторые дополнительные уточнения
Когда люди читают документацию, в которой говорится, что animateWithDuration
является рекомендуемым способом анимации, легко поверить, что он пытается заменить CABasicAnimation, CAAnimationGroup, CAKeyframeAnimation и т. Д., Но на самом деле это не так. Он заменяет beginAnimations:context:
и commitAnimations
, которые вы видели выше.