宽度的 CALayer 动画
CALayer animation for width
我有一个视图需要添加一层。我成功添加了层,但现在我想做动画,因为它的宽度意味着层从 "started" 标签开始填充并在 "awaiting..." 标签处结束。我尝试使用 CABasicAnimation 添加动画,它从头开始但没有正确填充。请查看视频以了解更多信息。
func startProgressAnimation()
{
self.ivStarted.isHighlighted = true
let layer = CALayer()
layer.backgroundColor = #colorLiteral(red: 0.4980392157, green: 0.8352941176, blue: 0.1921568627, alpha: 1)
layer.masksToBounds = true
layer.frame = CGRect.init(x: self.viewStartedAwaited.frame.origin.x, y: self.viewStartedAwaited.frame.origin.y, width: 0.0, height: self.viewStartedAwaited.frame.height)
self.ivStarted.layer.addSublayer(layer)
CATransaction.begin()
let boundsAnim:CABasicAnimation = CABasicAnimation(keyPath: "bounds.size.width")
boundsAnim.fromValue = NSNumber.init(value: 0.0)
boundsAnim.byValue = NSNumber.init(value: Float(self.viewStartedAwaited.frame.size.width / 2.0))
boundsAnim.toValue = NSNumber.init(value: Float(self.viewStartedAwaited.frame.size.width))
let anim = CAAnimationGroup()
anim.animations = [boundsAnim]
anim.isRemovedOnCompletion = false
anim.duration = 5
anim.fillMode = kCAFillModeBoth
CATransaction.setCompletionBlock{ [weak self] in
self?.ivAwaited.isHighlighted = true
}
layer.add(anim, forKey: "bounds.size.width")
CATransaction.commit()
}
Here is the video what i achieve with this code.
https://streamable.com/h6tpp
不合适
正确的形象
只需设置您的
layer.anchorPoint = CGPoint(x: 0, y: 0)
之后它将根据您的要求工作。
默认锚点(0.5,0.5) 意味着宽度的增长或收缩在两侧均匀发生。 (0,0) 的锚点意味着该层基本上固定在左上角,因此无论它获得什么新宽度,更改都会发生在右侧。也就是说,您的动画关键路径是 'bounds' 还是 'bounds.size.width' 并不重要。锚点决定了变化发生的位置
我有一个视图需要添加一层。我成功添加了层,但现在我想做动画,因为它的宽度意味着层从 "started" 标签开始填充并在 "awaiting..." 标签处结束。我尝试使用 CABasicAnimation 添加动画,它从头开始但没有正确填充。请查看视频以了解更多信息。
func startProgressAnimation()
{
self.ivStarted.isHighlighted = true
let layer = CALayer()
layer.backgroundColor = #colorLiteral(red: 0.4980392157, green: 0.8352941176, blue: 0.1921568627, alpha: 1)
layer.masksToBounds = true
layer.frame = CGRect.init(x: self.viewStartedAwaited.frame.origin.x, y: self.viewStartedAwaited.frame.origin.y, width: 0.0, height: self.viewStartedAwaited.frame.height)
self.ivStarted.layer.addSublayer(layer)
CATransaction.begin()
let boundsAnim:CABasicAnimation = CABasicAnimation(keyPath: "bounds.size.width")
boundsAnim.fromValue = NSNumber.init(value: 0.0)
boundsAnim.byValue = NSNumber.init(value: Float(self.viewStartedAwaited.frame.size.width / 2.0))
boundsAnim.toValue = NSNumber.init(value: Float(self.viewStartedAwaited.frame.size.width))
let anim = CAAnimationGroup()
anim.animations = [boundsAnim]
anim.isRemovedOnCompletion = false
anim.duration = 5
anim.fillMode = kCAFillModeBoth
CATransaction.setCompletionBlock{ [weak self] in
self?.ivAwaited.isHighlighted = true
}
layer.add(anim, forKey: "bounds.size.width")
CATransaction.commit()
}
Here is the video what i achieve with this code. https://streamable.com/h6tpp
不合适
正确的形象
只需设置您的
layer.anchorPoint = CGPoint(x: 0, y: 0)
之后它将根据您的要求工作。
默认锚点(0.5,0.5) 意味着宽度的增长或收缩在两侧均匀发生。 (0,0) 的锚点意味着该层基本上固定在左上角,因此无论它获得什么新宽度,更改都会发生在右侧。也就是说,您的动画关键路径是 'bounds' 还是 'bounds.size.width' 并不重要。锚点决定了变化发生的位置