UIGestureRecognizerクラス

2012. 02. 27
●概要

UIGestureRecognizerは、具象Gesture Recognizerクラスのための抽象基底クラスです。

Gesture Recognizerオブジェクト(または単にGesture Recognizer)は、ジェスチャを認識するためのロジックと認識上での作用を分離します。

これらのオブジェクトのいずれかが共通のジェスチャを認識する、またはいくつかのケースでは、ジェスチャの変化はそれぞれの指定されたターゲットオブジェクトにアクションメッセージを送信します。

UIGestureRecognizerの具象サブクラスは以下の通りです。

    UITapGestureRecognizer
    UIPinchGestureRecognizer
    UIRotationGestureRecognizer
    UISwipeGestureRecognizer
    UIPanGestureRecognizer
    UILongPressGestureRecognizer

UIGestureRecognizerクラスは、全ての具象Gesture Recognizer用に設定することができる共通動作の設定を定義します。

また、そのデリゲート(UIGestureRecognizerDelegateプロトコルを採用したオブジェクト)と通信することができ、それによって精細ないくつかの動作のカスタマイズが可能になります。

Gesture Recognizerでは、ヒットテストされた特定のビューとそのビューの全てのサブビューでタッチを処理します。

したがってビューは関連付けされる必要があります。

関連付けを行うには、UIViewのメソッドaddGestureRecognizer:を呼び出す必要があります。

Gesture Recognizerはビューのレスポンダチェーンに参加しません。

Gesture Recognizerは、関連付けられた一つ以上のターゲット/アクションのペアを持っています。

複数のターゲット/アクションのペアがある場合、それらは別個であり、累積されません。

ジェスチャの認識結果は、それらのペアのそれぞれのターゲットにアクションメッセージがディスパッチされます。

呼び出されるアクションメソッドは、以下のシグニチャのいずれかに準拠する必要があります。

- (void)handleGesture;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;

後者のシグニチャに準拠したメソッドは、いくつかのケースではターゲットが追加情報を照会するためにGesture Recognizerにメッセージを送信することができます。

例えばターゲットは、このジェスチャのアクションメソッドの最後の呼び出し以降の回転角度(ラジアン単位)について、UIRotationGestureRecognizerオブジェクトに尋ねることができます。

Gesture Recognizerのクライアントも、locationInView:またはlocationOfTouch:inView:を呼び出すことによって、ジェスチャの場所について尋ねることができます。

Gesture Recognizerによって解釈されたジェスチャは、単発または連続のどちらかになります。

単発ジェスチャは、ダブルタップなどのマルチタッチシーケンスで一度だけ発生し、単一のアクションの結果が送信されます。

ただし、Gesture Recognizerが回転ジェスチャなど連続ジェスチャと解釈する場合、マルチタッチシーケンスの終了まで各増分変化のアクションメッセージが送信されます。

タッチイベントは、Gesture Recognizerにアタッチされたヒットテストビューに提供する前に、ウィンドウに提供されます。

通常、Gesture Recognizerがマルチタッチシーケンス内のタッチのストリームを解析し、そのジェスチャを認識できなかった場合、ビューがタッチの完全な補完を受信します。

Gesture Recognizerがジェスチャを認識できた場合、ビューは残りのタッチをキャンセルします。

通常のジェスチャ認識のアクションのシーケンスは、cancelsTouchesInViewdelaysTouchesBegandelaysTouchesEndedプロパティのデフォルト値によって、以下のように経路が決定されます。

  • cancelsTouchesInView
    Gesture Recognizerがジェスチャを認識できた場合、ジェスチャの残りのタッチはビューからアンバインドされます(つまりウィンドウはそれらを提供しません)。
    ウィンドウは以前に提供されたタッチは(touchesCancelled:withEvent:)と共にキャンセルします。
    Gesture Recognizerがジェスチャを認識できなかった場合、ビューはマルチタッチシーケンス内の全てのタッチを受信します。

  • delaysTouchesBegan
    Gesture Recognizerがタッチイベントを解析する時、ジェスチャの認識に失敗していない場合は、ウィンドウはUITouchPhaseBeganフェーズでのアタッチされたビューへのタッチオブジェクトの提供を保留します。
    Gesture Recognizerが後続のジェスチャを認識した場合、ビューはタッチオブジェクトを受信しません。
    Gesture Recognizerがジェスチャを認識しない場合、ウィンドウはビューのtouchesBegan:withEvent:メソッドを呼び出して(その後おそらくタッチの現在位置の通知にtouchesMoved:withEvent:の呼び出して)これらのオブジェクトを提供します。

  • delaysTouchesEnded
    Gesture Recognizerがタッチイベントを解析する時、ジェスチャの認識に失敗していない場合は、ウィンドウはUITouchPhaseEndedでのアタッチされたビューへのタッチオブジェクトの提供を保留します。
    Gesture Recognizerが後続のジェスチャを認識した場合、タッチは(touchesCancelled:withEvent:メッセージで)キャンセルされます。
    Gesture Recognizerがジェスチャを認識しない場合、ウィンドウはビューのtouchesEnded:withEvent:メソッドを呼び出してこれらのオブジェクトを提供します。

上記での『認識』は、必ずしも認識された状態への遷移と同一ではないことに注意してください。


使用の特別な考慮事項

実行時に与えられたiOSのリリースでクラスを使用できるかを決定するには、通常クラスがnilかどうかをチェックします。

残念ながら、このテストはUIGestureRecognizerでは正確ではありません。

このクラスはiOS 3.2で公開を開始しましたが、それまでの開発期間は短いものでした。

クラスはそれ以前のリリースから存在していますが、それ以前のリリースではこのクラスと他のGesture Recognizerクラスの使用をサポートしていません。

それらのクラスのインスタンスの使用を試みるべきではありません。

アプリケーションでGesture Recognizerを使用できるかどうかを実行時に決定するには、クラスが存在するかどうかのテストと、インスタンスを割り当ててセレクタlocationInView:に応答するかを確認してください。

このメソッドはiOS 3.2までクラスに追加されていませんでした。

コードは次のようになります。

UIGestureRecognizer *gestureRecognizer = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(myAction:)];

if (![gestureRecognizer respondsToSelector:@selector(locationInView:)]) {
    [gestureRecognizer release];
    gestureRecognizer = nil;
}
// do something else if gestureRecognizer is nil


サブクラス化の注意

UIGestureRecognizerのサブクラスを生成することで、『チェックマーク』ジェスチャなどの独自のジェスチャを認識することができます。

このように具体的なGesture Recognizerを生成する場合は、UIGestureRecognizerSubclass.hヘッダファイルをインポートしてください。

このヘッダは、サブクラスがオーバーライド、呼び出し、またはリセットするために必要な全てのメソッドとプロパティを宣言しています。

Gesture Recognizerは定義済の状態マシン内で動作し、マルチタッチイベントを処理すると後続の状態に遷移します。

状態と可能な遷移は連続的か単発かで異なります。

全てのGesture RecognizerはPossible状態(UIGestureRecognizerStatePossible)でマルチタッチシーケンスを開始します。

単発ジェスチャは、ジェスチャの解釈の成否に応じて、PossibleからRecognized(UIGestureRecognizerStateRecognized)またはFailed(UIGestureRecognizerStateFailed)のいずれかに遷移します。

Gesture RecognizerがRecognizedに遷移した場合、ターゲットにアクションメッセージを送信します。

連続ジェスチャでは、Gesture Recognizerが作る可能性のある状態遷移は、次に示すようにより多数から成ります。

    Possible ----> Began ----> [Changed] ----> Cancelled
    Possible ----> Began ----> [Changed] ----> Ended

変更された状態は任意であり、CancelledまたはEnded状態に到達する前に複数回発生する可能性があります。

Gesture Recognizerは各状態遷移時にアクションメッセージを送信します。

したがってピンチなどの連続ジェスチャでは、アクションメッセージは2本の指が互いに向かって、あるいは離れて移動するものとして送信されます。

これらの状態を表す列挙型定数は、型UIGestureRecognizerStateです。
(RecognizedとEnded状態の定数は同義であることに注意してください)

サブクラスは状態が遷移する間に、適切な値にstateプロパティを設定する必要があります。


メソッドのオーバーライド

サブクラスがオーバーライドする必要があるメソッドは『サブクラス用のメソッド』で説明しています。

これらは(上述したように)定期的にstateプロパティをリセットする必要があり、ignoreTouch:forEvent:メソッドを呼び出すことができます。


特別な考慮事項

stateプロパティは読み込み専用としてUIGestureRecognizer.hで宣言されています。

このプロパティの宣言はGesture Recognizerのクライアントを対象としています。

UIGestureRecognizerのサブクラスは、UIGestureRecognizerSubclass.hをインポートする必要があります。

このヘッダファイルには読み書き可能なstateの再宣言が含まれています。



●タスク

●Gesture Recognizerの初期化


– initWithTarget:action:

●ターゲットとアクションの追加と削除


– addTarget:action:
– removeTarget:action:

●ジェスチャのタッチと場所の取得


– locationInView:
– locationOfTouch:inView:
– numberOfTouches

●Gesture Recognizerの状態とビューの取得


  state    property
  view    property
  enabled    property

●タッチのキャンセルと遅延


  cancelsTouchesInView    property
  delaysTouchesBegan    property
  delaysTouchesEnded    property

●Gesture Recognizer間の依存関係の指定


– requireGestureRecognizerToFail:

●デリゲートの設定と取得


  delegate    property

サブクラス用のメソッド


UIGestureRecognizerSubclass.hヘッダファイルには、UIGestureRecognizerのサブクラスによってのみ呼び出しまたはオーバーライドされることを意図されたメソッドを宣言する、クラスの拡張が含まれています。

単にUIGestureRecognizerの具象サブクラスを使用するクライアントでは、(指摘したものを除いて)これらのメソッドを呼び出さないでください。

– touchesBegan:withEvent:
– touchesMoved:withEvent:
– touchesEnded:withEvent:
– touchesCancelled:withEvent:
– reset
– ignoreTouch:forEvent:
– canBePreventedByGestureRecognizer:
– canPreventGestureRecognizer:



●プロパティ

Objective-Cのプロパティについての詳細は、『The Objective-C Programming Language』の『Properties』を参照してください。

state

@property(nonatomic, readonly) UIGestureRecognizerState state

Gesture Recognizerの現在の状態です。(読み込みのみ)

Gesture Recognizerの可能な状態はUIGestureRecognizerState型の定数によって表すことができます。

これらの状態のいくつかは単発ジェスチャに適用されません。

stateプロパティの読み込みのみのバージョンは、サブクラスではなく、Gesture Recognizerクラスのクライアントのために意図されています。

特別な考慮事項

UIGestureRecognizerのサブクラスはstateプロパティの読み書きバージョンを使用する必要があります。

サブクラスはUIGestureRecognizerSubclass.hヘッダファイルをインポートする時に、再宣言を取得します。

@property(nonatomic,readwrite) UIGestureRecognizerState state;

単発ジェスチャのGesture Recognizerは、UIGestureRecognizerStatePossibleからUIGestureRecognizerStateFailedまたはUIGestureRecognizerStateRecognizedへ遷移します。

連続ジェスチャのGesture RecognizerはUIGestureRecognizerStatePossibleからUIGestureRecognizerStateBeganUIGestureRecognizerStateChangedUIGestureRecognizerStateEndedという順のフェーズで遷移します。

ただしキャンセルのタッチを受信した場合は、UIGestureRecognizerStateCancelledに遷移します。

連続ジェスチャのGesture Recognizerがジェスチャとしてマルチタッチシーケンスを解釈できなかった場合、UIGestureRecognizerStateFailedへ遷移します。



●インスタンスメソッド

initWithTarget:action:

- (id)initWithTarget:(id)target action:(SEL)action

割り当てられたGesture Recognizerオブジェクトを、ターゲットとアクションセレクタで初期化します。

戻り値は具象UIGestureRecognizerサブクラスの初期化されたインスタンス、またはオブジェクトの初期化を試みた際にエラーが発生した場合はnilになります。

このメソッドは指定イニシャライザです。

Gesture Recognizerが生成された後、addTarget:action:を呼び出すことによって他のターゲット/アクションのペアを関連付けることができます。

target
:ジェスチャを認識した時に、レシーバによって送信されるアクションメッセージを受信するオブジェクトを指定します。
nilは有効な値ではありません。

action
:レシーバで認識されたジェスチャを処理する、ターゲットによって実装されたメソッドを識別するセレクタを指定します。
アクションセレクタは、クラスの概要で説明したシグニチャに準拠する必要があります。
NULLは有効な値ではありません。


numberOfTouches

- (NSUInteger)numberOfTouches

レシーバによって表されるジェスチャに関するタッチ数を返します。

戻り値は、レシーバによってプライベートな配列内に保持される、UITouchオブジェクト数です。

これらの各オブジェクトは、現在のジェスチャのタッチを表しています。

ループ内でこのメソッドによって返される値を使用して、locationOfTouch:inView:メソッドを使用して個々のタッチ位置を尋ねることができます。


requireGestureRecognizerToFail:

- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer

レシーバと他のGesture Recognizer間の依存関係を生成します。

このメソッドは、レシーバのUIGestureRecognizerStatePossibleからの遷移を遅延させる他のGesture Recognizerとの関係を生成します。

レシーバの遷移状態はotherGestureRecognizerで発生するものに依存します。
例えば、ダブルタップジェスチャが失敗した際にシングルタップジェスチャが必要な場合に、このメソッドを呼び出すことができます。

otherGestureRecognizer
:他のGesture Recognizerオブジェクト(UIGestureRecognizerのサブクラスのインスタンス)を指定します。



●定数

UIGestureRecognizerState

Gesture Recognizerの現在の状態です。

typedef enum {
    UIGestureRecognizerStatePossible,

    UIGestureRecognizerStateBegan,
    UIGestureRecognizerStateChanged,
    UIGestureRecognizerStateEnded,
    UIGestureRecognizerStateCancelled,

    UIGestureRecognizerStateFailed,

    UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
} UIGestureRecognizerState;

UIGestureRecognizerStatePossible
Gesture Recognizerはまだジェスチャを認識していないが、タッチイベントを評価することができます。
これはデフォルト状態です。

UIGestureRecognizerStateBegan
Gesture Recognizerは連続ジェスチャとして認識されたタッチオブジェクトを受信しています。
これは実行ループの次のサイクルでアクションメッセージ(またはメッセージ)を送信します。

UIGestureRecognizerStateChanged
Gesture Recognizerは連続ジェスチャへの変更として認識されたタッチを受信しています。
これは実行ループの次のサイクルでアクションメッセージ(またはメッセージ)を送信します。

UIGestureRecognizerStateEnded
Gesture Recognizerは連続ジェスチャの終了として認識されたタッチを受信しています。
これは実行ループの次のサイクルでアクションメッセージ(またはメッセージ)を送信し、UIGestureRecognizerStatePossibleへ状態をリセットします。

UIGestureRecognizerStateCancelled
Gesture Recognizerは連続ジェスチャをキャンセルするタッチを受信しています。
これは実行ループの次のサイクルでアクションメッセージ(またはメッセージ)を送信し、UIGestureRecognizerStatePossibleへ状態をリセットします。

UIGestureRecognizerStateFailed
Gesture Recognizerはジェスチャとして認識することができなかったマルチタッチシーケンスを受信しています。
アクションメッセージは送信されず、Gesture RecognizerはUIGestureRecognizerStatePossibleにリセットされます。

UIGestureRecognizerStateRecognized
Gesture Recognizerはジェスチャとして認識されたマルチタッチシーケンスを受信しています。
これは実行ループの次のサイクルでアクションメッセージ(またはメッセージ)を送信し、UIGestureRecognizerStatePossibleへ状態をリセットします。

Gesture Recognizerはタップやスワイプなどの単発イベントを認識しますが、ジェスチャ内の変更を報告しません。

言い換えると、単発ジェスチャはBeganとChanged状態を遷移させず、失敗やキャンセルをすることができません。



参考文献

UIGestureRecognizer Class Reference






Bose SoundLink around-ear wireless headphones II
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Bose SoundLink around-ear wireless headphones II
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR