CAShapeLayer,使用事务设置动画路径
CAShapeLayer, animating path with Transactions
我想知道为什么当我尝试使用基本动画为 CAShapeLayer
的 path
属性 设置动画时它可以工作,但是当我尝试使用事务来完成它时却没有.
我仅使用事务就成功地为其他 animatable
属性设置了动画。这是我当前的代码:
CATransaction.begin()
CATransaction.setAnimationDuration(2.0)
path = scalePath() // a scaled version of the original path
CATransaction.commit()
新路径是在 CAShapeLayer
:
的扩展中使用这个(非常硬编码的)函数缩放原始路径获得的
func scalePath()->CGPath{
var scaleTransform = CGAffineTransform.identity.translatedBy(x: -150, y: -150)
scaleTransform = scaleTransform.scaledBy(x: 10, y: 10)
let newPath = path?.copy(using: &scaleTransform)
return newPath!
}
你能找出什么问题吗?
答案很简单但有点不尽如人意:虽然 path
属性 是可动画的,但它不支持 implicit 动画。这在 the documentation for the path property 的讨论部分被调用:
Unlike most animatable properties, path
(as with all CGPathRef
animatable properties) does not support implicit animation.
显式与隐式动画
"explicit" 动画是一个动画对象(例如 CABasicAnimation
),通过在图层。
"implicit" 动画是一种 隐含地 发生的动画,作为更改动画 属性 的结果。
即使 属性 在事务中发生更改,动画也被视为隐式。
我想知道为什么当我尝试使用基本动画为 CAShapeLayer
的 path
属性 设置动画时它可以工作,但是当我尝试使用事务来完成它时却没有.
我仅使用事务就成功地为其他 animatable
属性设置了动画。这是我当前的代码:
CATransaction.begin()
CATransaction.setAnimationDuration(2.0)
path = scalePath() // a scaled version of the original path
CATransaction.commit()
新路径是在 CAShapeLayer
:
func scalePath()->CGPath{
var scaleTransform = CGAffineTransform.identity.translatedBy(x: -150, y: -150)
scaleTransform = scaleTransform.scaledBy(x: 10, y: 10)
let newPath = path?.copy(using: &scaleTransform)
return newPath!
}
你能找出什么问题吗?
答案很简单但有点不尽如人意:虽然 path
属性 是可动画的,但它不支持 implicit 动画。这在 the documentation for the path property 的讨论部分被调用:
Unlike most animatable properties,
path
(as with allCGPathRef
animatable properties) does not support implicit animation.
显式与隐式动画
"explicit" 动画是一个动画对象(例如 CABasicAnimation
),通过在图层。
"implicit" 动画是一种 隐含地 发生的动画,作为更改动画 属性 的结果。
即使 属性 在事务中发生更改,动画也被视为隐式。