swift - 通过 transform.scale 属性动画化 CAShapeLayer 的路径

标签 swift cashapelayer cgpath

我正在尝试为具有圆形路径(与 Playground 兼容)的 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

红色圆圈是我试图在其位置中心使用缩放动画制作动画且没有任何平移的图形。此圆圈设置为 CGPathCAShapeLayer

问题很明显——我的 CAShapeLayer 具有蓝色背景颜色动画,但路径不是。

我是不是错过了什么,或者这就是它的工作方式?也许这个动画应该以不同的方式来完成?

最佳答案

如果我的理解是正确的,那么您需要的是边界而不是框架。

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)

希望这是你需要的。

关于swift - 通过 transform.scale 属性动画化 CAShapeLayer 的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53160079/

相关文章:

ios - 使用 ARC 编码和解码 CGMutablePathRef

core-graphics - 保留线宽,同时使用 CGAffineTransform 缩放上下文中的所有点

iphone - 从文本中获取CGPath

ios - 编写简单的api调用测试

swift - 使用需要泛型的方法扩展 Swift 类型

swift - 为什么在第一次启动时我的导航栏在状态栏下面

ios - 如何使用 CAShaperLayer 设置圆角半径值?

ios - 如何在应用程序未运行时下载数据(应用程序被杀死)

ios - CAShapeLayer() 绘制奇怪的线条/路径

ios - Swift 3,用特殊的lineCap画圆