以下のコードではCALayer
、ユーザーが画面を押し続けているときに、画面の左側から画面の右側にアニメーション化しようとしています (longPressGestureRecognizer)。ユーザーが指を離すと、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
}
2 つの問題があります。
アニメーションの後 (ユーザーが指を離したとき) の幅を印刷すると
CALayer
、常に 0 になります。幅をアニメーション化し、拡大するため、新しい幅が得られない理由がわかりませんCALayer
。ユーザーが指を離してからもう一度押したままにすると、 が
CALayer
消えます。画面に残して別のを作成する必要があります。CALayer
削除しないので、なぜ消えてしまうのかわかりません。オブジェクトがまだ存在するメモリを確認しました。
問題#2への更新:別のレイヤーを作成するとCALayer
思いますが、レイヤーを再度追加することはできません。コピーを作成するかUIView
、レイヤーを追加できる を作成する必要があります。なぜそれが消えているのか、私はまだ理解していません。