22
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ロングプレスを検出して、プレスされている間に連続してアクションを呼出

Posted at

ロングプレス検出後、押し続けられている間、特定のアクションを呼び出し続けるコーディングを考えます。

環境

OS X: 10.8.5
Xcode: 5.1.1

ロングプレス・ジェスチャーリコグナイザ

xibまたは、storyboardのConnection inspectorから、ロングプレスイベントのアクションを設定することはできません。

UILongPressGestureRecognizerクラスを使って、ロングプレスされたとき呼出するアクションを設定します。
ここでは、self(ViewController)のlongPressアクションを呼び出しています。

初期設定

ViewControllerの初期処理
// プロパティの設定
@property (nonatomic, weak) IBOutlet UIButton *button;

// viewDidLoadなどで
// ジェスチャーリコグナイザの生成
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
// ボタンに設定
[_button addGestureRecognizer:longPress];

ロングプレスの検出時間間隔は、minimumPressDurationプロパティで設定できます。デフォルトは0.5秒です。

検出時間間隔の設定
longPress.minimumPressDuration = 0.5;

ロングプレスされている間に呼出する処理を記述します。最後にperformSelectorを使って0.5秒に再度自分自身を呼出します。

リピート処理

リピート処理
- (void)repeat:(id)sender
{
  //  リピート処理を記述

  // 0.5秒後に再度呼出
  [self performSelector:@selector(repeat:) withObject:nil afterDelay:0.5];

}

ロングプレス検出

ロングプレスが検出されたら、stateがUIGestureRecognizerStateBeganが設定されて一度だけ呼出されます。上記のrepeatメソッドを呼び出します。

このままでは、永遠にrepeatメソッドが呼び続けられるので、stateがUIGestureRecognizerStateEndedになったら、cancelPreviousPerformRequestsWithTargetで繰り返す処理をキャンセルします。

ここでは利用していませんが、ロングタップ中にドラッグするとstateがUIGestureRecognizerStateChanged
に設定されて呼出されます。

ロングプレス処理
- (void)longPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
  switch (gestureRecognizer.state) {

    case UIGestureRecognizerStateBegan:
      [self performSelector:@selector(repeat:) withObject:nil afterDelay:0.5];
      break;

    case UIGestureRecognizerStateChanged:
      break;

    case UIGestureRecognizerStateEnded:
      [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(repeat:) object:nil];
      break;

    default:
      break;
  }
}

これを利用すれば、ロングプレス時にカウントを連続して増減するような処理が実装できると思います。

もちろん、Touch Up Insideイベントとの併用も可能です。

androidでは、Threadを使ってロングプレス検出とリピート処理を実装していたのですが、iOSでは、ちょっと楽ですね。

22
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?