更改UIView的框架并更新cornerRadius

时间:2014-12-19 14:19:40

标签: ios animation core-animation

在我的应用中,我使用UIView子类来显示各种信息。我希望此视图显示为圆形,因此我将视图cornerRadius上的layer设置为self.bounds.size.width / 2

这可以按预期工作,直到我尝试为它们设置动画。我使用UIView.animateWithDuration为我的视图设置了动画,例如:

UIView.animateWithDuration(0.2, animations: { () -> Void in

    self.myView.frame = CGRectInset(self.myView.frame, -20, -20);

}) { (done) -> Void in

}

我希望我的视图还可以更新同一动画中图层的cornerRadius(或单独的动画,因为cornerRadius更改不会使用animateWithDuration进行动画处理。

这是我已经尝试过的:

  • 对CALayer进行子类化,绘制一个圆圈并将其放在MyView.layer之上。
  • 执行CABasicAnimation UIView.animatewithDuration正在运行

但是所有这些结果都会导致结果错误,因为边界尚未更新,或者在完成其他动画之前完成了添加的CALayer的调整大小。我希望它能够顺利过渡。

2 个答案:

答案 0 :(得分:3)

func changeBounds()
{
    let animation = CABasicAnimation()
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    animation.fromValue = NSValue(CGRect: self.theView.frame)
    animation.toValue = NSValue(CGRect: CGRectInset(self.theView.frame, 40, 40))
    animation.duration = 1.0
    self.theView.layer.addAnimation(animation, forKey: "bounds")

    CATransaction.begin()
    CATransaction.setDisableActions(true)
    self.theView.layer.frame = CGRectInset(self.theView.frame, 40, 40)
    CATransaction.commit()
}

func changeCornerRadius()
{
    let animation = CABasicAnimation(keyPath:"cornerRadius")
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    animation.fromValue = 0
    animation.toValue = self.theView.frame.size.width/2
    animation.duration = 1.0
    self.theView.layer.addAnimation(animation, forKey: "cornerRadius")
    self.theView.layer.cornerRadius = self.theView.frame.size.width/2
}

这似乎对我有用,只需这样打电话。

self.changeBounds()
self.changeCornerRadius()

将动画关键点设置为" bounds"而不是"框架"。或者您可以将这两个动画添加到动画组中。

答案 1 :(得分:0)

您可以使用此扩展来更改角半径的变化。

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
        self.layer.addAnimation(animation, forKey: "cornerRadius")
        self.layer.cornerRadius = to
    }
}