Swift : 动画 CALayer
Swift : Animate CALayer
在下面的代码中,当用户按住屏幕 (longPressGestureRecognizer) 时,我试图将 CALayer
从屏幕左侧动画化到屏幕右侧。当用户抬起手指时,CALayer
暂停。
var l = CALayer()
var holdGesture = UILongPressGestureRecognizer()
let animation = CABasicAnimation(keyPath: "bounds.size.width")
override func viewDidLoad() {
super.viewDidLoad()
setUpView()
}
func setUpView(){
l.frame = CGRect(x: 0, y: 0, width: 0, height: 10)
l.backgroundColor = UIColor.redColor().CGColor
self.view.addGestureRecognizer(holdGesture)
holdGesture.addTarget(self, action:"handleLongPress:")
}
func handleLongPress(sender : UILongPressGestureRecognizer){
if(sender.state == .Began) { //User is holding down on screen
print("Long Press Began")
animation.fromValue = 0
animation.toValue = self.view.bounds.maxX * 2
animation.duration = 30
self.view.layer.addSublayer(l)
l.addAnimation(animation, forKey: "bounds.size.width")
}
else { //User lifted Finger
print("Long press ended")
print("l width: \(l.bounds.size.width)")
pauseLayer(l)
}
}
func pauseLayer(layer : CALayer){
var pausedTime : CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
我有两个问题:
当我在动画后(当用户抬起手指时)打印 CALayer
的宽度时,它始终为 0。我为宽度及其扩展设置动画,因此我不知道为什么它没有给我 CALayer
.
的新宽度
用户抬起手指,然后再次按住后,CALayer
消失。我需要它保留在屏幕上,并创建另一个 CALayer
,我不会以任何方式删除它,所以我不明白为什么它也会消失。我检查了对象仍然存在的内存
问题 #2 的更新:我相信要创建另一个 CALayer
我不能只再次添加图层。我必须创建一个副本或创建一个可以添加图层的 UIView
。我仍然不明白为什么它会消失。
基本上,您是在尝试在用户按住时调整图层大小。这是一个可用于调整给定图层大小的函数:
如果要原点固定在左边,需要先设置图层的锚点:
layer.anchorPoint = CGPointMake(0.0, 1);
func resizeLayer(layer:CALayer, newSize: CGSize) {
let oldBounds = layer.bounds;
var newBounds = oldBounds;
newBounds.size = size;
//Ensure at the end of animation, you have proper bounds
layer.bounds = newBounds
let boundsAnimation = CABasicAnimation(keyPath: "bounds")
positionAnimation.fromValue = NSValue(CGRect: oldBounds)
positionAnimation.toValue = NSValue(CGRect: newBounds)
positionAnimation.duration = 30
}
对于你的情况,我不确定你在哪里恢复暂停的图层。还要观察每次用户点击时,都会在您的 handleLongPress 方法中添加一个新动画!这会产生不良影响。理想情况下,您只需要在第一次启动动画,然后再恢复之前启动的暂停动画。
//Flag that holds if the animation already started..
var animationStarted = false
func handleLongPress(sender : UILongPressGestureRecognizer){
//User is holding down on screen
if(sender.state == .Began){
if(animationStarted == false){
let targetBounds = CalculateTargetBounds() //Implement this to your need
resizeLayer(layer, targetBounds)
animationStarted = true
}else {
resumeLayer(layer)
}
}else {
pauseLayer(layer)
}
}
在下面的代码中,当用户按住屏幕 (longPressGestureRecognizer) 时,我试图将 CALayer
从屏幕左侧动画化到屏幕右侧。当用户抬起手指时,CALayer
暂停。
var l = CALayer()
var holdGesture = UILongPressGestureRecognizer()
let animation = CABasicAnimation(keyPath: "bounds.size.width")
override func viewDidLoad() {
super.viewDidLoad()
setUpView()
}
func setUpView(){
l.frame = CGRect(x: 0, y: 0, width: 0, height: 10)
l.backgroundColor = UIColor.redColor().CGColor
self.view.addGestureRecognizer(holdGesture)
holdGesture.addTarget(self, action:"handleLongPress:")
}
func handleLongPress(sender : UILongPressGestureRecognizer){
if(sender.state == .Began) { //User is holding down on screen
print("Long Press Began")
animation.fromValue = 0
animation.toValue = self.view.bounds.maxX * 2
animation.duration = 30
self.view.layer.addSublayer(l)
l.addAnimation(animation, forKey: "bounds.size.width")
}
else { //User lifted Finger
print("Long press ended")
print("l width: \(l.bounds.size.width)")
pauseLayer(l)
}
}
func pauseLayer(layer : CALayer){
var pausedTime : CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
我有两个问题:
当我在动画后(当用户抬起手指时)打印
CALayer
的宽度时,它始终为 0。我为宽度及其扩展设置动画,因此我不知道为什么它没有给我CALayer
. 的新宽度
用户抬起手指,然后再次按住后,
CALayer
消失。我需要它保留在屏幕上,并创建另一个CALayer
,我不会以任何方式删除它,所以我不明白为什么它也会消失。我检查了对象仍然存在的内存
问题 #2 的更新:我相信要创建另一个 CALayer
我不能只再次添加图层。我必须创建一个副本或创建一个可以添加图层的 UIView
。我仍然不明白为什么它会消失。
基本上,您是在尝试在用户按住时调整图层大小。这是一个可用于调整给定图层大小的函数:
如果要原点固定在左边,需要先设置图层的锚点:
layer.anchorPoint = CGPointMake(0.0, 1);
func resizeLayer(layer:CALayer, newSize: CGSize) {
let oldBounds = layer.bounds;
var newBounds = oldBounds;
newBounds.size = size;
//Ensure at the end of animation, you have proper bounds
layer.bounds = newBounds
let boundsAnimation = CABasicAnimation(keyPath: "bounds")
positionAnimation.fromValue = NSValue(CGRect: oldBounds)
positionAnimation.toValue = NSValue(CGRect: newBounds)
positionAnimation.duration = 30
}
对于你的情况,我不确定你在哪里恢复暂停的图层。还要观察每次用户点击时,都会在您的 handleLongPress 方法中添加一个新动画!这会产生不良影响。理想情况下,您只需要在第一次启动动画,然后再恢复之前启动的暂停动画。
//Flag that holds if the animation already started..
var animationStarted = false
func handleLongPress(sender : UILongPressGestureRecognizer){
//User is holding down on screen
if(sender.state == .Began){
if(animationStarted == false){
let targetBounds = CalculateTargetBounds() //Implement this to your need
resizeLayer(layer, targetBounds)
animationStarted = true
}else {
resumeLayer(layer)
}
}else {
pauseLayer(layer)
}
}