【问题标题】:Change the frame of an UIView and update cornerRadius更改 UIView 的框架并更新cornerRadius
【发布时间】:2014-12-19 14:19:39
【问题描述】:

在我的应用程序中,我使用UIView 子类来显示各种信息。我希望这些视图显示为圆形,因此我将视图 layer 上的 cornerRadius 设置为 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 的顶部。
  • UIView.animatewithDuration 运行时执行 CABasicAnimation

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

【问题讨论】:

标签: ios animation core-animation


【解决方案1】:
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()

将动画键设置为“边界”而不是“帧”。或者您可以将这两个动画添加到一个动画组中。

【讨论】:

    【解决方案2】:

    您可以使用此扩展程序为拐角半径变化设置动画。

    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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多