Swift で UILabel の animateWithDuration 中にタップイベントを取得したい
Swift でティッカーのようなものを作成しています。
UILabel
が animationWithDuration
によって画面右外から左端へ流れてきて、一定時間停止した後、画面左外へ消え、次の UILabel
がまた右から流れてくるという単純なものです。
各 UILabel
をタップした際に、イベントが上手く取得できず悩んでいます。
TopicsLabel:
import UIKit
class TopicsLabel: UILabel {
required init(frame: CGRect, tag: Int, topics: String) {
super.init(frame: frame)
self.text = topics
self.tag = tag
commonInit()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() {
self.textAlignment = NSTextAlignment.Left
self.userInteractionEnabled = true
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
super.touchesEnded(touches, withEvent: event)
println(self.tag)
}
}
これを、親である ViewController
から、複数個 addSubview
し、下記アニメーションで順番に流すように動かしています。
UIView.animateWithDuration(
0.3,
delay: show_delay,
options: .CurveEaseInOut | .AllowUserInteraction | .AllowAnimatedContent,// | .BeginFromCurrentState
animations: {() -> Void in
target.center = CGPoint(x: 0+target.bounds.width/2, y: 0+target.bounds.height/2)
return
},
completion: {(Bool) -> Void in
UIView.animateWithDuration(
0.1,
delay: 3.0,
options: .CurveLinear | .AllowUserInteraction | .AllowAnimatedContent,// | .BeginFromCurrentState
animations: {() -> Void in
target.center = CGPoint(x: -self.bounds.width, y: 0+target.bounds.height/2)
return
},
completion: {(Bool) -> Void in
target.center = CGPoint(x: self.bounds.width + self.bounds.width/2, y: target.bounds.height/2)
self.showAnimation(target_tag + 1)
}
)
}
)
アニメーション自体は上手くいくのですが、色々と調べていたところアニメーションの仕様で、アニメーションが始まる前にすでに設定された位置にオブジェクトは移動しているが、見た目上はまだ移動していないように見えるだけということで、タッチイベントが発生する位置が、アニメーション後のまだティッカーの存在していないエリアになっています。
ちなみに、 UILabel
が左端に来た際に一旦イベントを終了すれば良いかと思い、 completion
ブロックの中に次のイベントを書くのではなく、右から左端にくるアニメーション(A)と、左端から画面外に出て行くアニメーション(B)を別々に設定し、Bで行っていたdelayの代わりにAとBの間に sleep
を入れてみましたが、 sleep
の間もイベントは発生しませんでした。
タッチイベント自体が動いてないようにも思います。
何か足がかりをいただければと思います。