【问题标题】:How to animate the end and the control points SWIFT如何为结束点和控制点设置动画 SWIFT
【发布时间】:2016-03-05 16:39:49
【问题描述】:

我的视图中有一个 CAShapeLayer,它具有 Bezierpath 实例的到 CGPath 投射路径。我现在想为结尾和两个控制点设置动画,例如那条线的末端正在移动(不停止)。怎么做?我查看了 CABasicAninmations 但没有得到如何访问端点。与动画与持续时间相同。如何在无尽的时间里做到这一点。

【问题讨论】:

标签: swift uibezierpath cashapelayer cabasicanimation animatewithduration


【解决方案1】:

您可以使用CADisplayLink(类似于NSTimer,除了动画帧更新的最佳时机)并更新CAShapeLayerpath


例如:

var displayLink: CADisplayLink?
var startTime: CFAbsoluteTime?
let duration = 2.0

var shapeLayer: CAShapeLayer?

override func viewDidLoad() {
    super.viewDidLoad()

    shapeLayer = CAShapeLayer()
    shapeLayer?.fillColor = UIColor.clearColor().CGColor
    shapeLayer?.strokeColor = UIColor.blueColor().CGColor
    shapeLayer?.lineWidth = 10
    shapeLayer?.frame = view.bounds
    view.layer.addSublayer(shapeLayer!)

    startTime = CFAbsoluteTimeGetCurrent()
    displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:")
    displayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
}

func handleDisplayLink(displayLink: CADisplayLink) {
    let elapsed = CFAbsoluteTimeGetCurrent() - startTime!
    let percent = (elapsed % duration) / duration

    let path = UIBezierPath()
    let startPoint = CGPoint(x: 0, y: view.bounds.size.height / 2.0)
    let controlPoint = CGPoint(x: view.bounds.size.width / 20, y: view.bounds.size.height * CGFloat(0.5 + sin(percent * M_PI * 2.0) / 2.0))
    let endPoint = CGPoint(x: view.bounds.size.width - 1, y: view.bounds.size.height / 2.0)
    path.moveToPoint(startPoint)
    path.addQuadCurveToPoint(endPoint, controlPoint: controlPoint)

    shapeLayer?.path = path.CGPath
}

产生:

【讨论】:

    【解决方案2】:

    这里有一些可能性。

    • 提前配置动画,即通过生成一系列绘图,就像卡通的单元格一样,对这些图像使用简单的 UIImageView 动画。

    • 使用 CAShapeLayer 并在两个 path 值之间设置动画。不幸的是,这并不能让您完全控制中间帧,但您可以使用关键帧动画来提供中间帧,从而提供额外的控制。

    • 为绘图的实际点设置动画。这是最难配置的,但它是真正的动画,它可以让您完全控制动画。这就是我在这里所做的:我通过创建一个自定义动画属性来做到这一点——在这种情况下,一个表示三角形底点的 x 位置的属性。您必须为所有要设置动画的点执行此操作。

    【讨论】:

    猜你喜欢
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多