将UIView的CALayer动画化以实现圆角

8

我想要对我的视图的圆角进行动画处理。cornerRadius属性被列为可动画处理的,但是我似乎无法使其工作。实际上,我也无法使任何其他属性进行动画处理,但是我对圆角比较感兴趣。以下是我的代码,非常简单:

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

self.myView.layer.cornerRadius = 50.0f;

[CATransaction commit];

我在这里错过了什么吗?角落变得圆润,但瞬间完成而不是需要2秒钟。
3个回答

10
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"];

这段代码位于哪里?是在viewDidLoad中吗?还是在viewWillAppear中?或者是在viewDidAppear中? - picciano
这是按钮按下的操作。 - Micah Hainline
请参见上面的新、改进答案。 - picciano

7

Swift 4.2/5:

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")

Swift 3/4.0:

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")

更新:

正如马克所指出的那样,使用#keyPath来描述要进行动画的属性更加简洁:

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

2
#keyPath(CALayer.cornerRadius) 会稍微好一些。 - Mark Bridges

1

看起来你想太多了。我能够在不使用CoreAnimation的情况下完成任务。这是我所做的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接