Как я могу изменить cornerRadius кнопки после ее преобразования? [Дубликат]

Используйте это в своем файле градиента приложения ...

implementation 'androidx.legacy:legacy-support-core-ui:1.0.0-alpha1'
55
задан sabalaba 13 January 2016 в 10:10
поделиться

7 ответов

tl; dr: Угловой радиус не анимативен в animateWithDuration:animations:.


Что говорит документация об анимации вида.

Как показано в разделе в разделе «Анимация» в «Руководстве по программированию для iOS», говорится

Оба UIKit и Core Animation обеспечивают поддержку анимации, но уровень поддержки, предоставляемый каждой технологией, различается. В UIKit анимации выполняются с использованием объектов UIView

Полный список свойств, которые можно анимировать, используя либо старый

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

Несколько строк вниз вы можете прочитать список анимационных свойств Core Animation, где вы видите это:

  • Граница слоя (включая ли углы слоя округлены)

Итак, чтобы оживить cornerRadius, вам нужно использовать Core Animation, как вы уже сказали в своем обновленном вопросе (и ответе). Я просто добавил, что пытался объяснить, почему это так.


Некоторые дополнительные разъяснения

Когда люди читают документацию, в которой говорится, что animateWithDuration - рекомендуемый способ анимации, полагать, что он пытается заменить CABasicAnimation, CAAnimationGroup, CAKeyframeAnimation и т. д., но на самом деле это не так. Его заменили beginAnimations:context: и commitAnimations, которые вы видели выше.

83
ответ дан KlimczakM 27 August 2018 в 02:09
поделиться

Не похоже, что это один из анимативных свойств.

См. полный список:

http://developer.apple.com/library /ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/AnimatingViews/AnimatingViews.html

1
ответ дан Chris 27 August 2018 в 02:09
поделиться

Вы можете сделать это свойство анимированным в +[UIView animateWithDuration:], реализовав -[actionForLayer:forKey] в вашем классе вида. См. этот вопрос для примера того, как.

1
ответ дан Community 27 August 2018 в 02:09
поделиться

Я использую это расширение для анимации изменения радиуса угла:

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
    }
}
21
ответ дан damirstuhec 27 August 2018 в 02:09
поделиться

Начиная с iOS 10 вы можете реально изменить уголRadius:

UIViewPropertyAnimator(duration: 3.0, curve: .easeIn) {
    square.layer.cornerRadius = 20
}.startAnimation()
1
ответ дан edwardmp 27 August 2018 в 02:09
поделиться

Изменение углового радиуса может быть анимировано, но единственный способ сделать это - использовать CABasicAnimation. Надеюсь, это поможет кому-то там.

15
ответ дан singingAtom 27 August 2018 в 02:09
поделиться

Вы можете реализовать анимацию 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:"];
12
ответ дан voiger 27 August 2018 в 02:09
поделиться