Swift : CALayer动画后的宽度
Swift : Width of CALayer after animation
您在下面看到的代码创建了一个 CALayer(矩形)并在用户按住屏幕(longPressGestureRecognizer)时从左到右对其进行动画处理。当他们抬起手指时,CALayer 停止动画。您可以在新项目中直接复制粘贴代码:
//Global Variables
var layer: CALayer?
var holdGesture = UILongPressGestureRecognizer()
let animation = CABasicAnimation(keyPath: "bounds.size.width")
func setUpView() {
self.view.addGestureRecognizer(holdGesture)
holdGesture.addTarget(self, action:"handleLongPress:")
}
func handleLongPress(sender : UILongPressGestureRecognizer) {
if(sender.state == .Began) {
let newLayer = CALayer()
newLayer.frame = CGRect(x: 0, y: 0, width: 0, height: 10)
newLayer.backgroundColor = UIColor.redColor().CGColor
animation.fromValue = 0
animation.toValue = self.view.bounds.width * 2
animation.duration = 5
self.view.layer.addSublayer(newLayer)
print("Long Press Began")
newLayer.addAnimation(animation, forKey: "bounds.size.width")
layer = newLayer
}
else {
print("Long press ended")
if let layer = layer {
pauseLayer(layer)
}
}
}
func pauseLayer(layer : CALayer){
let pausedTime : CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
当 "Long press ended" 发生时(用户松开手指)图层有一个新的宽度。但是,当我打印它时,它说它是“0.0”。我不知道为什么。如何获取动画后图层的宽度?
tl;dr: 您可以通过层的 presentationLayer()
获取动画期间出现的值。
您遇到了层的模型值与其表示值之间的差异。当您向图层添加动画时,它只会更改图层在屏幕上的显示方式(演示值),但不会更改实际的 属性 动画(模型值)。
当简单地从一个值到另一个值设置动画时,通常会将动画 属性 设置为其最终值,以便动画完成后模型和演示文稿将相同。
但是,由于看起来您在动画完成之前暂停了动画,因此不会为您提供当前显示在屏幕上的值(演示值)。相反,您可以为它的表示层请求一个层,它保存(近似)当前值,因为它们出现在屏幕上。
您在下面看到的代码创建了一个 CALayer(矩形)并在用户按住屏幕(longPressGestureRecognizer)时从左到右对其进行动画处理。当他们抬起手指时,CALayer 停止动画。您可以在新项目中直接复制粘贴代码:
//Global Variables
var layer: CALayer?
var holdGesture = UILongPressGestureRecognizer()
let animation = CABasicAnimation(keyPath: "bounds.size.width")
func setUpView() {
self.view.addGestureRecognizer(holdGesture)
holdGesture.addTarget(self, action:"handleLongPress:")
}
func handleLongPress(sender : UILongPressGestureRecognizer) {
if(sender.state == .Began) {
let newLayer = CALayer()
newLayer.frame = CGRect(x: 0, y: 0, width: 0, height: 10)
newLayer.backgroundColor = UIColor.redColor().CGColor
animation.fromValue = 0
animation.toValue = self.view.bounds.width * 2
animation.duration = 5
self.view.layer.addSublayer(newLayer)
print("Long Press Began")
newLayer.addAnimation(animation, forKey: "bounds.size.width")
layer = newLayer
}
else {
print("Long press ended")
if let layer = layer {
pauseLayer(layer)
}
}
}
func pauseLayer(layer : CALayer){
let pausedTime : CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
当 "Long press ended" 发生时(用户松开手指)图层有一个新的宽度。但是,当我打印它时,它说它是“0.0”。我不知道为什么。如何获取动画后图层的宽度?
tl;dr: 您可以通过层的 presentationLayer()
获取动画期间出现的值。
您遇到了层的模型值与其表示值之间的差异。当您向图层添加动画时,它只会更改图层在屏幕上的显示方式(演示值),但不会更改实际的 属性 动画(模型值)。
当简单地从一个值到另一个值设置动画时,通常会将动画 属性 设置为其最终值,以便动画完成后模型和演示文稿将相同。
但是,由于看起来您在动画完成之前暂停了动画,因此不会为您提供当前显示在屏幕上的值(演示值)。相反,您可以为它的表示层请求一个层,它保存(近似)当前值,因为它们出现在屏幕上。