Используйте это в своем файле градиента приложения ...
implementation 'androidx.legacy:legacy-support-core-ui:1.0.0-alpha1'
tl; dr: Угловой радиус не анимативен в animateWithDuration:animations:
.
Как показано в разделе в разделе «Анимация» в «Руководстве по программированию для iOS», говорится
Оба UIKit и Core Animation обеспечивают поддержку анимации, но уровень поддержки, предоставляемый каждой технологией, различается. В UIKit анимации выполняются с использованием объектов UIView
blockquote>Полный список свойств, которые можно анимировать, используя либо старый
[UIView beginAnimations:context:]; [UIView setAnimationDuration:]; // Change properties here... [UIView commitAnimations];
, либо новый
[UIView animateWithDuration:animations:];
(которые вы используете):
- frame
- bounds
- center
- transform ( CGAffineTransform, а не CATransform3D)
- alpha
- backgroundColor
- contentStretch
Как вы можете видеть,
cornerRadius
не в списке.Некоторая путаница
анимации UIView действительно предназначены только для анимации свойств вида. Что смущает людей, так это то, что вы также можете анимировать те же свойства на слое внутри блока анимации UIView, то есть кадр, границы, положение, непрозрачность, backgroundColor. Поэтому люди видят анимацию слоев внутри
animateWithDuration
и считают, что они могут анимировать любое свойство вида там.В этом же разделе говорится:
В тех местах, где вы хотите выполнить более сложные анимации или анимации, не поддерживаемые классом UIView, вы можете использовать Core Animation и базовый слой представления для создания анимации. Поскольку объекты вида и слоя сложным образом связаны друг с другом, изменения на уровне представления влияют на представление.
blockquote>Несколько строк вниз вы можете прочитать список анимационных свойств Core Animation, где вы видите это:
blockquote>
- Граница слоя (включая ли углы слоя округлены)
Итак, чтобы оживить
cornerRadius
, вам нужно использовать Core Animation, как вы уже сказали в своем обновленном вопросе (и ответе). Я просто добавил, что пытался объяснить, почему это так.
Некоторые дополнительные разъяснения
Когда люди читают документацию, в которой говорится, что
animateWithDuration
- рекомендуемый способ анимации, полагать, что он пытается заменить CABasicAnimation, CAAnimationGroup, CAKeyframeAnimation и т. д., но на самом деле это не так. Его заменилиbeginAnimations:context:
иcommitAnimations
, которые вы видели выше.
Не похоже, что это один из анимативных свойств.
См. полный список:
Вы можете сделать это свойство анимированным в +[UIView animateWithDuration:]
, реализовав -[actionForLayer:forKey]
в вашем классе вида. См. этот вопрос для примера того, как.
Я использую это расширение для анимации изменения радиуса угла:
extension UIView
{
func addCornerRadiusAnimation(from: CGFloat, to: CGFloat, duration: CFTimeInterval)
{
let animation = CABasicAnimation(keyPath:"cornerRadius")
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
animation.fromValue = from
animation.toValue = to
animation.duration = duration
layer.add(animation, forKey: "cornerRadius")
layer.cornerRadius = to
}
}
Начиная с iOS 10 вы можете реально изменить уголRadius:
UIViewPropertyAnimator(duration: 3.0, curve: .easeIn) {
square.layer.cornerRadius = 20
}.startAnimation()
Изменение углового радиуса может быть анимировано, но единственный способ сделать это - использовать CABasicAnimation. Надеюсь, это поможет кому-то там.
Вы можете реализовать анимацию UIView, как здесь: http://maniacdev.com/2013/02/ios-uiview-category-allowing-you-to-set-up-customizable-animation-properties
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"cornerRadius"];
animation.duration = DURATION;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animation.toValue = @(NEW_CORNER_RADIUS);
animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
[view.layer addAnimation:animation forKey:@"setCornerRadius:"];