Ios 将UIView的CALayer设置为圆角的动画

Ios 将UIView的CALayer设置为圆角的动画,ios,animation,core-animation,rounded-corners,catransition,Ios,Animation,Core Animation,Rounded Corners,Catransition,我正在尝试设置视图角的圆角动画。cornerRadius属性被列为可设置动画,但我似乎无法使其工作。实际上,我也无法获得任何其他属性来设置动画,但角点是我感兴趣的。这是我的代码,非常简单: [CATransaction begin]; [CATransaction setValue: [NSNumber numberWithFloat: 2.0f] forKey:kCATransactionAnimationDuration]; self.myView.layer.cornerRadius =

我正在尝试设置视图角的圆角动画。cornerRadius属性被列为可设置动画,但我似乎无法使其工作。实际上,我也无法获得任何其他属性来设置动画,但角点是我感兴趣的。这是我的代码,非常简单:

[CATransaction begin];
[CATransaction setValue: [NSNumber numberWithFloat: 2.0f] forKey:kCATransactionAnimationDuration];

self.myView.layer.cornerRadius = 50.0f;

[CATransaction commit];

伙计们,我错过了什么?角变圆了,但它是瞬间的,而不是2秒钟。

Swift 4.2/5

CABasicAnimation *anim1 = [CABasicAnimation animationWithKeyPath:@"cornerRadius"];
anim1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
anim1.fromValue = [NSNumber numberWithFloat:0.0f];
anim1.toValue = [NSNumber numberWithFloat:50.0f];
anim1.duration = 2.0;
[self.myView.layer addAnimation:anim1 forKey:@"cornerRadius"];
let anim1 = CABasicAnimation(keyPath: "cornerRadius")
anim1.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
anim1.fromValue = 0
anim1.toValue = 50
anim1.duration = 2.0
layer.add(anim1, forKey: "cornerRadius")
let anim1 = CABasicAnimation(keyPath: "cornerRadius")
anim1.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
anim1.fromValue = 0
anim1.toValue = 50
anim1.duration = 2.0
myView.layer.add(anim1, forKey: "cornerRadius")
Swift 3/4.0

let anim1 = CABasicAnimation(keyPath: "cornerRadius")
anim1.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
anim1.fromValue = 0
anim1.toValue = 50
anim1.duration = 2.0
layer.add(anim1, forKey: "cornerRadius")
let anim1 = CABasicAnimation(keyPath: "cornerRadius")
anim1.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
anim1.fromValue = 0
anim1.toValue = 50
anim1.duration = 2.0
myView.layer.add(anim1, forKey: "cornerRadius")
更新:

正如Mark所注意到的,使用
#keyPath
来描述要设置动画的属性更为简洁:

let anim1 = CABasicAnimation(keyPath: #keyPath(CALayer.cornerRadius))

看来你想得太多了。我不用CoreAnimation就可以过得去。以下是我所做的:

UIView.animate(withDuration: animationDuration) {
    self.myView.layer.cornerRadius = 10.0
}

这个代码在哪里?在viewDidLoad中?还是会出现?或者ViewDidDisplay?这是一个按钮按下的动作。有关新的、改进的答案,请参见上文#keyPath(CALayer.cornerRadius)会稍微好一点。