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