TapTaps(2)~イベント処理メソッド(2)

2012. 03. 04
前回はタップ回数の検出を排他処理していませんでしたが、タップ回数に応じて排他的に処理を行う場合もありますので、対応してみます。


●タップ回数の排他処理

タップ回数に応じて排他処理を行うよう、touchesBegan:withEvent:メソッドを改修します。

これはiOS 3.x版のサンプルコードの『13 TapTaps Fixed』に相当します。
(太字が追加修正した部分)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    NSUInteger tapCount = [touch tapCount];

    switch (tapCount) {
        case 1:
            [self performSelector:@selector(singleTap) withObject:nil afterDelay:.4];
            break;
        case 2:
            [NSObject cancelPreviousPerformRequestsWithTarget:self
                selector:@selector(singleTap) object:nil];
            [self performSelector:@selector(doubleTap) withObject:nil afterDelay:.4];

            break;
        case 3:
            [NSObject cancelPreviousPerformRequestsWithTarget:self
                selector:@selector(doubleTap) object:nil];
            [self performSelector:@selector(tripleTap) withObject:nil afterDelay:.4];

            break;
        case 4:
            [NSObject cancelPreviousPerformRequestsWithTarget:self
                selector:@selector(tripleTap) object:nil];

            [self quadrupleTap];
            break;
        default:
            break;
    }
}

7857

改修前はタップ回数に応じてタップ用メソッドを普通に(即時)呼び出していましたが、それをperformSelector:withObject:afterDelay:メソッドによる遅延呼び出しに変更しています。

最初のタップが検出されてからタップ用メソッドを呼び出すまで0.4秒遅延させることで、直後に次のタップが検出されるか待機できることになります。
(初版の本書中では遅延時間が0.25秒と記述されていますが、何かの間違いと思われます)

0.4秒以内に次のタップが検出されれば連続したタップとみなし、待機させていたタップ用メソッドをcancelPreviousPerformRequestsWithTarget:selector:object:メソッドで実行をキャンセルします。

0.4秒以内に次のタップが検出されなければ単独の(またはそれまでの連続した)タップとみなし、タップ用メソッドが実行されます。
(クァドラプルタップは次のタップを待つ必要が無いので、即時実行されます)

cancelPreviousPerformRequestsWithTarget:selector:object:

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument

performSelector:withObject:afterDelay:に以前に登録されている実行要求をキャンセルします。

同じターゲットaTarget、引数anArgument、セレクタaSelectorを持つ全ての実行要求がキャンセルされます。

このメソッドは現在の実行ループ内のみの実行要求を削除するもので、全ての実行ループではありません。

aTargetperformSelector:withObject:afterDelay:インスタンスメソッドに以前に登録されている要求のターゲットを指定します。

aSelectorperformSelector:withObject:afterDelay:インスタンスメソッドに以前に登録されている要求のセレクタを指定します。
SEL型の説明については『セレクタ』を参照してください。

anArgumentperformSelector:withObject:afterDelay:インスタンスメソッドに以前に登録されている要求の引数を指定します。
引数の等しさはisEqual:を使用して決定されるので、値は大元で渡されたものと同じオブジェクトである必要はありません。
大元で引数にnilが渡されている場合は、一致するようにnilを渡します。


●実行結果

待機時間の都合上、タップしてからワンテンポ遅れてラベルが表示されます。

7858

そのため、タイミングによっては2つのラベルが表示される瞬間がありますが、その辺は実際のアプリケーションを組む際に、実行の待機時間や表示の遅延時間を調整することで解決してください。
(下図はトリプルタップの後、シングルタップした場合)

7859



参考文献

iOSイベント処理ガイド

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る






Wave SoundTouch music system IV
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

Wave SoundTouch music system IV
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