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 () { }