在两个贝塞尔曲线路径形状之间进行动画处理

可可

我发现要UIImageView在两种状态之间设置动画很麻烦:其原始矩形框,以及使用创建的新形状UIBezierPath提到了许多不同的技术,其中大多数对我不起作用。

首先是意识到使用UIView块动画是行不通的。显然,不能在一个animateWithDuration:块中执行子层动画(请参见此处此处

剩下的CAAnimation是具体的子类CABasicAnimation我很快意识到,不能从一个视图CAShapeLayer到另一个视图不能进行动画处理(例如,请参见此处)。

而且它们不能只是任何两个形状层路径,而是“仅当从喜欢到喜欢进行动画设置时,才能保证对形状层的路径进行动画处理”(请参见此处

有了这些,就会出现一些更平凡的问题,例如,用于fromValuetoValue(应该是CAShapeLayerCGPath?),将动画添加到什么((layermask?))等。

似乎变量太多了。哪种组合会给我我想要的动画?

可可

第一个重要点是类似地构造两条贝塞尔曲线路径,因此矩形是较复杂形状的(平凡)类似物。

// the complex bezier path
let initialPoint = CGPoint(x: 0, y: 0)
let curveStart = CGPoint(x: 0, y: (rect.size.height) * (0.2))
let curveControl = CGPoint(x: (rect.size.width) * (0.6), y: (rect.size.height) * (0.5))
let curveEnd = CGPoint(x: 0, y: (rect.size.height) * (0.8))
let firstCorner = CGPoint(x: 0, y: rect.size.height)
let secondCorner = CGPoint(x: rect.size.width, y: rect.size.height)
let thirdCorner = CGPoint(x: rect.size.width, y: 0)

var myBezierArc = UIBezierPath()
myBezierArc.moveToPoint(initialPoint)
myBezierArc.addLineToPoint(curveStart)
myBezierArc.addQuadCurveToPoint(curveEnd, controlPoint: curveControl)
myBezierArc.addLineToPoint(firstCorner)
myBezierArc.addLineToPoint(secondCorner)
myBezierArc.addLineToPoint(thirdCorner)

创建矩形的更简单的“平凡”贝塞尔曲线路径完全相同,但是controlPoint设置了,所以它似乎不存在:

let curveControl = CGPoint(x: 0, y: (rect.size.height) * (0.5))

(尝试删除该addQuadCurveToPoint行以获得非常奇怪的动画!)

最后,动画命令:

let myAnimation = CABasicAnimation(keyPath: "path")

if (isArcVisible == true) {
    myAnimation.fromValue = myBezierArc.CGPath
    myAnimation.toValue = myBezierTrivial.CGPath
} else {
    myAnimation.fromValue = myBezierTrivial.CGPath
    myAnimation.toValue = myBezierArc.CGPath
}       
myAnimation.duration = 0.4
myAnimation.fillMode = kCAFillModeForwards
myAnimation.removedOnCompletion = false

myImageView.layer.mask.addAnimation(myAnimation, forKey: "animatePath")

如果有人感兴趣,该项目就在这里

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

对在drawRect()中绘制的贝塞尔曲线路径进行动画处理

沿贝塞尔曲线路径的一部分对UIView进行动画处理

贝塞尔曲线路径拓宽

以曲线形状剪切贝塞尔曲线路径

沿贝塞尔曲线路径放置图像

无法消除贝塞尔曲线路径上的尖峰

用于点检测的宽贝塞尔曲线路径

圆形贝塞尔曲线路径不正确

从两个端点贝塞尔曲线中找到两个控制点

使用closePath函数关闭贝塞尔曲线路径与手动关闭它之间有什么区别?

如何在现有曲线p5.js的两个贝塞尔曲线点之间绘制重叠曲线

如何将视图/图层的移动路径约束为贝塞尔曲线路径?

动画贝塞尔曲线直线

在二次贝塞尔曲线路径上寻找点

如何使用贝塞尔曲线路径剪切UIView?

如何用渐变色填充贝塞尔曲线路径

不想贝塞尔曲线路径被视框剪切

根据汽车的贝塞尔曲线路径旋转汽车的前轮

快速旋转贝塞尔曲线路径圆中的笔触边缘

使用贝塞尔曲线路径作为剪贴蒙版

从3D立方贝塞尔曲线路径获取一致的法线

在UIView的贝塞尔曲线路径中绘制/绘制类似草图颜色的颜色

贝塞尔曲线路径未根据上下文绘制

使用贝塞尔曲线路径(Swift)创建自定义分段控件

检查闭合的三次方贝塞尔曲线路径是否在椭圆内部

如何在圆形贝塞尔曲线路径内绘制图像

从两个相交的贝塞尔路径获取子路径

如何在Kineticjs中对曲线路径上的对象进行动画处理

如何将多个贝塞尔曲线路径添加到同一个视图 swift 3