swift - transform.scale 上的 CABasicAnimation 在 X 和 Y 轴上平移 CAShapeLayer

标签 swift cabasicanimation

我试图在按钮周围添加脉动效果,但是,我使用的代码会翻译 CAShapeLayer 并增加其大小。

如何在此动画期间仅增加 CAShapeLayer 的比例,同时保持其在 View 中的位置静态?

我已将代码隔离到一个执行此动画的简单项目中,并且它仍在发生。

在此处查看视频效果:/image/or3s2.jpg

要测试这个:

  1. 创建一个新项目
  2. 在 View 中心添加一个按钮
  3. 将其作为 IBOutlet 链接到 viewControllers 代码文件,名称为 beginButton

这是我的代码:

let pulsatingLayer = CAShapeLayer()

override func viewDidLoad() {
    super.viewDidLoad()
    let circularPath = UIBezierPath(arcCenter: beginButton.center, radius: beginButton.bounds.midX, startAngle: -CGFloat.pi / 2, endAngle: 2 * .pi, clockwise: true)

    pulsatingLayer.path = circularPath.cgPath
    pulsatingLayer.strokeColor = UIColor.clear.cgColor
    pulsatingLayer.lineWidth = 10
    pulsatingLayer.fillColor = UIColor.red.cgColor
    pulsatingLayer.lineCap = kCALineCapRound
    view.layer.addSublayer(pulsatingLayer)

    animatePulsatingLayer()
}

private func animatePulsatingLayer() {
    let pulseAnimation = CABasicAnimation(keyPath: "transform.scale")
    pulseAnimation.toValue = 1.5
    pulseAnimation.duration = 1
    pulseAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
    pulseAnimation.autoreverses = true
    pulseAnimation.repeatCount = Float.infinity
    pulsatingLayer.add(pulseAnimation, forKey: "pulsing")
}

谢谢!

最佳答案

您的动画是相对于 View 帧的原点的。

通过将圆形路径的中心更改为CGPoint.zero,您将获得以图层原点为中心的脉冲动画。然后将其添加到原点以按钮为中心的新 pulsatingView 中,脉冲层以按钮为中心。

override func viewDidLoad() {
    super.viewDidLoad()
    let circularPath = UIBezierPath(arcCenter: CGPoint.zero, radius: beginButton.bounds.midX, startAngle: -CGFloat.pi / 2, endAngle: 2 * .pi, clockwise: true)

    pulsatingLayer.path = circularPath.cgPath
    pulsatingLayer.strokeColor = UIColor.clear.cgColor
    pulsatingLayer.lineWidth = 10
    pulsatingLayer.fillColor = UIColor.red.cgColor
    pulsatingLayer.lineCap = kCALineCapRound

    let pulsatingView = UIView(frame: .zero)
    view.addSubview(pulsatingView)
    view.bringSubview(toFront: beginButton)

    // use Auto Layout to place the new pulsatingView relative to the button
    pulsatingView.translatesAutoresizingMaskIntoConstraints = false
    pulsatingView.leadingAnchor.constraint(equalTo: beginButton.centerXAnchor).isActive = true
    pulsatingView.topAnchor.constraint(equalTo: beginButton.centerYAnchor).isActive = true

    pulsatingView.layer.addSublayer(pulsatingLayer)
    animatePulsatingLayer()
}

关于swift - transform.scale 上的 CABasicAnimation 在 X 和 Y 轴上平移 CAShapeLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51347554/

相关文章:

ios - Swift - 通过 switch 语句对 CAGradientLayer 进行动画处理

ios - 如何使用 API 断开/停止扫描 Socket Mobile 扫描器?

ios - 计算解析类中的对象数量并将其分配给变量

ios - 在 iPad 上禁用手写笔滚动

ios - 做CABeginAnimation时如何正确设置模型

c# - 无法在 Xamarin.iOS 中为微光设置动画渐变层

ios - Swift 中同一 UIView 的多个动画

ios - Swift,当 Core Animation 完成时

xcode - Swift 错误解析 Facebook Graph API 对象 : EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP)

ios - CAAnimationGroup 与 CAKeyframeAnimation 和 CABasicAnimation