ユーザーが2秒間押し続けたかどうかを検出しています。
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 2.0;
[self addGestureRecognizer:longPress];
[longPress release];
これは私が長押しを処理する方法です:
-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer{
NSLog(@"double oo");
}
2秒以上押し続けると、テキスト「double oo」が2回印刷されます。どうしてこれなの?どうすれば修正できますか?
UILongPressGestureRecognizerは、継続的なイベント認識エンジンです。状態を見て、これがイベントの開始、中間、または終了であるかどうかを確認し、それに応じて行動する必要があります。つまり、開始後にすべてのイベントを破棄するか、必要に応じて動きのみを見ることができます。 クラス参照 から:
長押しのジェスチャーは継続的です。ジェスチャは、許容される指の数(numberOfTouchesRequired)が指定された期間(minimumPressDuration)の間押され、タッチが許容される移動範囲(allowableMovement)を超えて移動しないときに開始します(UIGestureRecognizerStateBegan)。ジェスチャレコグナイザーは、指が動くたびに変更状態に移行し、指のいずれかが離されると終了します(UIGestureRecognizerStateEnded)。
これで状態を追跡できます
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
NSLog(@"UIGestureRecognizerStateEnded");
//Do Whatever You want on End of Gesture
}
else if (sender.state == UIGestureRecognizerStateBegan){
NSLog(@"UIGestureRecognizerStateBegan.");
//Do Whatever You want on Began of Gesture
}
}
UILongPressGestureRecognizerの状態を確認するには、セレクターメソッドにifステートメントを追加するだけです。
- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
NSLog(@"Long press Ended");
} else if (sender.state == UIGestureRecognizerStateBegan) {
NSLog(@"Long press detected.");
}
}
状態ごとに異なる動作があるため、正しい状態を確認する必要があります。ほとんどの場合、UIGestureRecognizerStateBegan
とともにUILongPressGestureRecognizer
状態が必要になります。
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 1.0;
[myView addGestureRecognizer:longPress];
[longPress release];
...
- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
if(UIGestureRecognizerStateBegan == gesture.state) {
// Called on start of gesture, do work here
}
if(UIGestureRecognizerStateChanged == gesture.state) {
// Do repeated work here (repeats continuously) while finger is down
}
if(UIGestureRecognizerStateEnded == gesture.state) {
// Do end work here when finger is lifted
}
}
Objective-C
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
NSLog(@"Long press Ended");
} else if (sender.state == UIGestureRecognizerStateBegan) {
NSLog(@"Long press detected.");
}
}
Swift 2.2:
func handleLongPress(sender:UILongPressGestureRecognizer) {
if (sender.state == UIGestureRecognizerState.Ended) {
print("Long press Ended");
} else if (sender.state == UIGestureRecognizerState.Began) {
print("Long press detected.");
}
}
Swift 3.0:
func handleLongPress(sender: UILongPressGestureRecognizer) {
if sender.state == .ended {
print("Long press Ended")
} else if sender.state == .began {
print("Long press detected")
}
Swiftでの処理方法は次のとおりです。
func longPress(sender:UILongPressGestureRecognizer!) {
if (sender.state == UIGestureRecognizerState.Ended) {
println("Long press Ended");
} else if (sender.state == UIGestureRecognizerState.Began) {
println("Long press detected.");
}
}
ジェスチャーハンドラーは、ジェスチャーの各状態の呼び出しを受け取ります。そのため、各状態にチェックを入れ、コードを必要な状態にする必要があります。
If-elseよりswitch-caseの使用を好まなければなりません:
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 1.0;
[myView addGestureRecognizer:longPress];
[longPress release];
-(void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
switch(gesture.state){
case UIGestureRecognizerStateBegan:
NSLog(@"State Began");
break;
case UIGestureRecognizerStateChanged:
NSLog(@"State changed");
break;
case UIGestureRecognizerStateEnded:
NSLog(@"State End");
break;
default:
break;
}
}