代码之家  ›  专栏  ›  技术社区  ›  pacification

通过transform.scale属性设置层路径的动画

  •  0
  • pacification  · 技术社区  · 6 年前

    CAShapeLayer

    import UIKit
    import PlaygroundSupport
    
    let view = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 200, height: 200)))
    view.backgroundColor = .white
    
    let animation = CABasicAnimation(keyPath: "transform.scale")
    animation.duration = 1
    animation.fromValue = 0
    animation.toValue = 1
    animation.autoreverses = true
    animation.repeatCount = .greatestFiniteMagnitude
    
    let frame = CGRect(origin: CGPoint(x: 40, y: 40), size: CGSize(width: 30, height: 30))
    let path = CGPath(ellipseIn: frame, transform: nil)
    
    let layer = CAShapeLayer()
    layer.frame = frame
    layer.path = path
    layer.backgroundColor = UIColor.blue.cgColor
    layer.fillColor = UIColor.red.cgColor
    
    view.layer.addSublayer(layer)
    layer.add(animation, forKey: nil)
    
    PlaygroundPage.current.liveView = view
    

    结果如下:

    enter image description here

    红色的圆是我试图在它的位置的中心用缩放动画来制作动画的图形,没有任何平移。此圆设置为 CGPath CAShapeLayer公司

    我的问题很明显 CAShapeLayer公司 使用蓝色背景色按预期设置动画,但路径不是。

    是我错过了什么还是这就是它的工作方式?也许这个动画应该用另一种方式来做?

    1 回复  |  直到 6 年前
        1
  •  1
  •   pacification    6 年前

    如果我的理解是正确的,你需要的是一个界限而不是框架。

    let frame = CGRect(origin: CGPoint(x: 40, y: 40), size: CGSize(width: 30, height: 30))
    

    let bounds = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 30, height: 30))
    let path = CGPath(ellipseIn: bounds, transform: nil)
    

    希望这是你需要的。