私の元の答えでは、ボタンをタップと長押しの両方を認識させる方法の質問に答えました。明らかになった質問では、ユーザーが指を押さえている限り、このボタンを連続的に「発射」したいと思われます。その場合、ジェスチャー認識機能は1つだけ必要です。
はたとえば、Interface Builderで、ボタン上にオブジェクトライブラリから長押しジェスチャー認識をドラッグして、ゼロに「最低期間」を設定:することができます制御その後
をアシスタントエディタでコードの長押しジェスチャー認識から押しながらドラッグして長押しを処理するために@IBAction
を追加:
var timer: NSTimer?
@IBAction func longPressHandler(gesture: UILongPressGestureRecognizer) {
if gesture.state == .Began {
timer = NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: "handleTimer:", userInfo: nil, repeats: true)
} else if gesture.state == .Ended || gesture.state == .Cancelled {
timer?.invalidate()
timer = nil
}
}
func handleTimer(timer: NSTimer) {
NSLog("bang")
}
あるいは、あなたはまた、ユーザーがボタンの外に指をドラッグしたときに発射を停止したい場合は、ジェスチャーの場所のチェックを追加します。
@IBAction func longPressHandler(gesture: UILongPressGestureRecognizer) {
if gesture.state == .Began {
timer = NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: "handleTimer:", userInfo: nil, repeats: true)
} else if gesture.state == .Ended || gesture.state == .Cancelled || (gesture.state == .Changed && !CGRectContainsPoint(gesture.view!.bounds, gesture.locationInView(gesture.view))) {
timer?.invalidate()
timer = nil
}
}
私のオリジナルの答えを、両方のタップを認識する方法の別の質問に答えると、ボタンを長く押すが、以下である:あなたがしたい場合は、長押しジェスチャーで、
override func viewDidLoad() {
super.viewDidLoad()
let longPress = UILongPressGestureRecognizer(target: self, action: "handleLongPress:")
button.addGestureRecognizer(longPress)
let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
tap.requireGestureRecognizerToFail(longPress)
button.addGestureRecognizer(tap)
}
func handleTap(gesture: UITapGestureRecognizer) {
print("tap")
}
func handleLongPress(gesture: UILongPressGestureRecognizer) {
if gesture.state == .Began {
print("long press")
}
}
:
個人的に
、私はタップして長押しジェスチャー認識装置、例えばを使用したいです.Ended
にあなたの行動を実行することもできます。それは単に目的のUXに依存します。
FYI、あなたはまた、右Interface Builderでこれら二つのジェスチャー認識機能を追加することができ、あまりにも、(単にボタンの上のオブジェクトライブラリからそれぞれのジェスチャーをドラッグして、制御@IBAction
機能にジェスチャー認識から押しながらドラッグ)プログラマチックに表示することで何が起きているのかを簡単に説明することができました。
出典
2015-12-12 03:57:20
Rob
すごく、ありがとう!しかし、単なる不思議なことに、singleFireを@IBAction関数としてトップレベルの標準関数に移動する必要があります。これはbuttonDown()とIBAction singleFireが同時に発生するためですか?もう一度おねがいします – Tim
タイマーに渡される関数 'singleFire'のセレクタは、パラメータを取らないことを示しているので、 '@ IBAction'とタイマーから呼び出すのは意味がありません。 1つの '.TouchDown'ハンドリング関数を持って、それがsingleFireを呼び出させるようにするのは明らかです。 – vacawama
偉大な、説明のおかげで。 – Tim