Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何设置端点和控制点的动画_Swift_Uibezierpath_Cashapelayer_Cabasicanimation_Animatewithduration - Fatal编程技术网

Swift 如何设置端点和控制点的动画

Swift 如何设置端点和控制点的动画,swift,uibezierpath,cashapelayer,cabasicanimation,animatewithduration,Swift,Uibezierpath,Cashapelayer,Cabasicanimation,Animatewithduration,我在我的视图中有一个CAShapeLayer,它具有Bezierpath实例的到CGPath浇铸路径。现在我想设置端点和两个控制点的动画,例如,该线的端点正在移动(而不是停止)。怎么做?我查看了CABASICANNMATIONS,但没有了解访问端点的方式。使用持续时间设置动画也一样。如何在无止境的时间内实现这一点。您可以使用CADisplayLink(它就像NSTimer,除了动画帧更新的最佳时间外)并更新CAShapeLayer的路径 例如: var displayLink: CADispl

我在我的视图中有一个CAShapeLayer,它具有Bezierpath实例的到CGPath浇铸路径。现在我想设置端点和两个控制点的动画,例如,该线的端点正在移动(而不是停止)。怎么做?我查看了CABASICANNMATIONS,但没有了解访问端点的方式。使用持续时间设置动画也一样。如何在无止境的时间内实现这一点。

您可以使用
CADisplayLink
(它就像
NSTimer
,除了动画帧更新的最佳时间外)并更新
CAShapeLayer
路径


例如:

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
}
这将产生:


您可以使用
CADisplayLink
(就像
NSTimer
,除了动画帧更新的最佳时间外)并更新
现金流层的
路径


例如:

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
}
这将产生:


以下是一些可能性

  • 提前配置动画,也就是说,通过生成一系列图形,就像动画的单元一样,并使用这些图像的简单UIImageView动画

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

  • 为图形的实际点设置动画。这是最难配置的,但它是真正的动画,它可以让您完全控制动画。这就是我在这里所做的:我通过创建一个自定义的可设置动画的属性来实现它——在本例中,一个表示三角形底点x位置的属性。对于要设置动画的所有点,都必须这样做


以下是一些可能性

  • 提前配置动画,也就是说,通过生成一系列图形,就像动画的单元一样,并使用这些图像的简单UIImageView动画

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

  • 为图形的实际点设置动画。这是最难配置的,但它是真正的动画,它可以让您完全控制动画。这就是我在这里所做的:我通过创建一个自定义的可设置动画的属性来实现它——在本例中,一个表示三角形底点x位置的属性。对于要设置动画的所有点,都必须这样做


请分享您实施的第三个选项的源代码好吗?@Vitaly请分享您实施的第三个选项的源代码好吗?@Vitaly