【问题标题】:CASpringAnimation for UIView frameUIView 框架的 CASpringAnimation
【发布时间】:2017-01-15 15:33:01
【问题描述】:

我正在使用此代码为带有弹簧动画的视图设置动画,但它似乎没有这样做。视图在没有任何“弹簧”动画的情况下捕捉到框架。

之前您建议这样做:

UIView.animate(withDuration: 0.65, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 3.0, options: .curveEaseOut , animations: {...}

我只想告诉你,我的视图使用cornerRadius,所以我不能用上面的动画cornerRadius!

 magnifyView (layer: CALayer, size: CGSize) {

     let oldBounds = layer.bounds
        var newBounds = oldBounds
        newBounds.size = size

        let animateFrame = CASpringAnimation(keyPath: "transform.scale")

        animateFrame.fromValue = NSValue(cgRect: oldBounds)
        animateFrame.toValue = NSValue(cgRect: newBounds)
        animateFrame.damping = 0.65
        animateFrame.initialVelocity = 3.0
        animateFrame.duration = animateFrame.settlingDuration


            layer.add(animateFrame, forKey: "transform.scale")
             layer.bounds = newBounds

}

【问题讨论】:

    标签: ios uiview swift3 caanimation


    【解决方案1】:

    你的动画是错误的。您将 key path 设置为 transform.scale,这将是一个 CGFloat,它会导致整个视图改变大小。

    然后插入 CGRects 的 fromValue 和 toValue NSValue。我怀疑您在运行该代码时会在控制台中收到错误。

    如果要为框架设置动画,请为框架设置动画。 (不是边界,框架。)使用

    let oldFrame = layer.frame
    

    ...

    let animateFrame = CASpringAnimation(keyPath: "frame")
    

    ...

    animateFrame.fromValue = NSValue(cgRect: oldFrame)
    animateFrame.toValue = NSValue(cgRect: newFrame)
    

    ...

    layer.frame = newFrame
    

    编辑:

    使用问题开头提到的 UIView 动画当然更容易做到这一点。试试这样的代码:

    class ViewController: UIViewController {
    
      var isLarge: Bool = false
      @IBOutlet weak var roundLabel: UILabel!
    
      @IBAction func handleResizeButton(_ sender: UIButton) {
        isLarge = !isLarge
        let size: CGFloat = isLarge ? 1.5 : 1.0
        UIView.animate(withDuration: 0.65, delay: 0, 
          usingSpringWithDamping: 0.6, 
          initialSpringVelocity: 3.0, 
          options: .curveEaseOut, 
          animations: {
            self.roundLabel.transform = CGAffineTransform(scaleX: size, y: size)
          }
        )
      }
    }
    

    【讨论】:

    • 我的控制台没有错误。将边界更改为帧对我的动画没有影响(仍然是快照而不是弹簧)
    • 请注意,您还需要更改用于创建动画的 keyPath。
    • 如果您使用自动布局,则更改框架将无法按预期工作。视图上的约束将接管并将帧更改为最终值,覆盖动画。您应该在视图的 x 和 7 位置上使用 UIView 动画和动画约束。
    • 你说“我只是想告诉你我的视图使用cornerRadius,所以我不能用上面的动画cornerRadius!”我不知道那是什么意思。您发布的代码不会改变您视图的cornerRadius,所以我不确定您的意思。您可以使用 UIView 动画为具有非零角半径的视图设置动画,并且效果很好。
    • 不,你是对的。这不是完成的代码。我只是想明确一点,我想将cornerRadius 动画化为框架......
    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多