UIView上での左右のスワイプを検出する その2

UISwipeGestureRecognizerを使う方法。自前でイベントを処理するよりはるかにコードが簡潔になる。

using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.ObjCRuntime;

public class UISwipeView : UIView
{
  UISwipeGestureRecognizer swRecognizerR;
  UISwipeGestureRecognizer swRecognizerL;
  public UISwipeView ()
  {
    swRecognizerL = new UISwipeGestureRecognizer ();
    swRecognizerL.AddTarget (this, new Selector ("HandleSwipe"));
    swRecognizerL.Direction = UISwipeGestureRecognizerDirection.Left;
    swRecognizerL.NumberOfTouchesRequired = 1;
    swRecognizerL.Delegate = new SwipeGestureRecognizerDelegate ();
    AddGestureRecognizer (swRecognizerL);
    swRecognizerR = new UISwipeGestureRecognizer ();
    swRecognizerR.AddTarget (this, new Selector ("HandleSwipe"));
    swRecognizerR.Direction = UISwipeGestureRecognizerDirection.Right;
    swRecognizerR.NumberOfTouchesRequired = 1;
    swRecognizerR.Delegate = new SwipeGestureRecognizerDelegate ();
    AddGestureRecognizer (swRecognizerR);
  }
  protected override void Dispose (bool disposing)
  {
    RemoveGestureRecognizer(swRecognizerL);
    swRecognizerL.Dispose();
    swRecognizerL = null;
    RemoveGestureRecognizer(swRecognizerR);
    swRecognizerR.Dispose();
    swRecognizerR = null;
    base.Dispose (disposing);
  }
  private class SwipeGestureRecognizerDelegate : UIGestureRecognizerDelegate
  {
    public override bool ShouldReceiveTouch (UIGestureRecognizer recognizer, UITouch touch)
    {
      return true;
    }
  }
  [Export("HandleSwipe")]
  void HandleSwipe (UISwipeGestureRecognizer rec)
  {
    // スワイプが発生したのでなにか処理
  }
}
  • 追加するUISwipeGestureRecognizerを変更すれば上下スワイプ、右スワイプと下スワイプだけ、といった検出も可能
  • UISwipeGestureRecognizerのNumberOfTouchesRequiredでスワイプに必要な指の本数を指定可能。


欠点としてイベントをハンドルするメソッドがSelector指定になるのでインスタンス毎にSelector名を変えなければならない。これはなんとかならないんだろうか。

AddTargetにはdelegateも指定できるのだが、こうすると実機では例外が発生してしまう。

  swRecognizer.AddTarget (HandleSwipe);

  // 省略

  void HandleSwipe ()
  {
  }