Swipes(2)~Gesture Recognizer

2012. 02. 29
Swipes(1)~イベント処理メソッド』では、スワイプ操作を旧来のタッチイベント処理メソッド(touchesBegan:withEvent:touchesMoved:withEvent:touchesEnded:withEvent:touchesCancelled:withEvent:)を使用して処理しました。

原著であるApress社のiOS 3.x版のサンプルコード『13 Swipes』とiOS 4.x版のサンプルコード『15 - Swipes』は同じですが、iOS 4.x版には『15 - Swipes 2』として同内容をGesture Recognizerを使用する方法に書き換えています。

後程マルチスワイプに対応するにあたり、タッチイベント処理メソッドを使うiOS 3.x版と、Gesture Recognizerを使うiOS 4.x版の両方を試すので、オリジナルのSwipesプロジェクトを別のフォルダなどにコピーして残しておくと便利です。

Gesture RecognizerはiOS 3.2で導入されたジェスチャ認識を支援する技術で、特に複雑なマルチタッチジェスチャの検出をタッチイベント処理メソッドよりも簡易に行うことが可能になります。
(『iOSイベント処理ガイド』参照)


●スワイプジェスチャ認識用定数

iOS 4.x版では、ジェスチャをスワイプと認識するための定数kMinimumGestureLengthとkMaximumVarianceがヘッダファイルではなくソースファイルで定義されています。

ただしGesture Recognizerを利用する場合は、これらの定数は使用しません。


●SwipesViewController.mソースファイルの編集

Gesture Recognizerでジェスチャを認識するコードを記述するためviewDidLoadメソッドのコメントアウト解除と追記を行い、それに伴って不要となるtouchesBegan:withEvent:touchesMoved:withEvent:メソッドの削除を行います。
またGesture Recognizerで水平および垂直スワイプを認識した際に、呼び出してラベルを更新するメソッドを2つ追加します。
(太字が追加修正した部分)

#import "SwipesViewController.h"

@implementation SwipesViewController

@synthesize label;
@synthesize gestureStartPoint;

- (void)eraseText {
    label.text = @"";
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad {
    [super viewDidLoad];

    UISwipeGestureRecognizer *vertical = [[[UISwipeGestureRecognizer alloc]
        initWithTarget:self action:@selector(reportVerticalSwipe:)] autorelease];
    vertical.direction = UISwipeGestureRecognizerDirectionUp |
        UISwipeGestureRecognizerDirectionDown;
    [self.view addGestureRecognizer:vertical];

    UISwipeGestureRecognizer *horizontal = [[[UISwipeGestureRecognizer alloc]
        initWithTarget:self action:@selector(reportHorizontalSwipe:)] autorelease];
    horizontal.direction = UISwipeGestureRecognizerDirectionLeft |
        UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:horizontal];

}

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;

    self.label = nil;
    [super viewDidUnload];
}

- (void)dealloc {
    [label release];
    [super dealloc];
}

#pragma mark -

- (void)reportHorizontalSwipe:(UIGestureRecognizer *)recognizer {
    label.text = @"Horizontal swipe detected";
    [self performSelector:@selector(eraseText) withObject:nil afterDelay:2];
}

- (void)reportVerticalSwipe:(UIGestureRecognizer *)recognizer {
    label.text = @"Vertical swipe detected";
    [self performSelector:@selector(eraseText) withObject:nil afterDelay:2];
}


@end

7839


1)viewDidLoadメソッド

viewDidLoadメソッドはビューコントローラのビューを読み込んだ後に呼び出されるメソッドで、ここではGesture Recognizerの生成と初期化を行っています。

Gesture Recognizerの生成と初期化)

最初にUIGestureRecognizerの具象サブクラス(スワイプの場合UISwipeGestureRecognizerクラス)のインスタンスをallocメソッドで生成し、initWithTarget:action:メソッドでGesture Recognizerを初期化します。

アクションメッセージはSwipesViewController.m内に記述するので、第一引数targetはselfに、実行するアクションメソッドを指定する第二引数は、垂直スワイプはreportVerticalSwipe:、水平スワイプはreportHorizontalSwipe:メソッドを指定します。

どちらの初期化コードもautoreleaseメソッドでGesture Recognizerのインスタンスの解放を指定していますが、Apple公式のGesture Recognizerを使用しているサンプルコードを4つ確認した所、内3つは普通にreleaseメソッドで解放しているので、特にautoreleaseメソッドで解放した方が良いという理由は無さそうです。

今回の場合はジェスチャを認識した後、その結果をラベルに2秒間表示するだけなので、addGestureRecognizer:メソッドの呼び出し直後でreleaseしても問題ありません。

スワイプ方向の設定)

垂直スワイプ用のインスタンスverticalと水平スワイプ用のインスタンスhorizontalそれぞれに、directionプロパティで認識するスワイプの方向を設定します。

垂直スワイプには上下方向(UISwipeGestureRecognizerDirectionUpUISwipeGestureRecognizerDirectionDownのOR)、水平スワイプには左右方向(UISwipeGestureRecognizerDirectionLeftUISwipeGestureRecognizerDirectionRightのOR)を指定します。

ビューへのアタッチ)

ビューコントローラSwipesViewController下のビューに、addGestureRecognizer:メソッドで両スワイプのGesture Recognizerをアタッチします。

initWithTarget:action:

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

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

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

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

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

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

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

direction

@property(nonatomic) UISwipeGestureRecognizerDirection direction

このGesture Recognizerでのスワイプの許可される方向です。

デフォルトの方向はUISwipeGestureRecognizerDirectionRightです。

詳細についてはUISwipeGestureRecognizerDirection定数の説明を参照してください。

UISwipeGestureRecognizerDirection

スワイプの方向です。

typedef enum {
    UISwipeGestureRecognizerDirectionRight = 1 << 0,
    UISwipeGestureRecognizerDirectionLeft = 1 << 1,
    UISwipeGestureRecognizerDirectionUp = 1 << 2,
    UISwipeGestureRecognizerDirectionDown = 1 << 3
} UISwipeGestureRecognizerDirection;

UISwipeGestureRecognizerDirectionRight
右方向へのタッチスワイプ。
この方向はデフォルトです。

UISwipeGestureRecognizerDirectionLeft
左方向へのタッチスワイプ。

UISwipeGestureRecognizerDirectionUp
上方向へのタッチスワイプ。

UISwipeGestureRecognizerDirectionDown
下方向へのタッチスワイプ。

addGestureRecognizer:

- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer

ビューにGesture Recognizerをアタッチします。

ビューにGesture Recognizerをアタッチすると、タッチを受信するビューとその全てのサブビューにヒットテストを行い、表されたジェスチャのスコープを定義します。

ビューはGesture Reconizerを保持します。

gestureRecognizerUIGestureRecognizerクラスから派生したクラスのオブジェクトを指定します。
このパラメータはnilでない必要があります。


2)reportHorizontalSwipe:メソッド

reportHorizontalSwipe:メソッドは、水平スワイプが認識された場合に呼び出されるメソッドで、textプロパティでラベルの文字列を設定して表示した後、performSelector:withObject:afterDelay:メソッドで2秒後にeraseTextメソッドを呼び出すことによって文字列を消去しています。


3)reportVerticalSwipe:メソッド

reportVerticalSwipe:メソッドは、垂直スワイプが認識された場合に呼び出されるメソッドで、textプロパティでラベルの文字列を設定して表示した後、performSelector:withObject:afterDelay:メソッドで2秒後にeraseTextメソッドを呼び出すことによって文字列を消去しています。



参考文献

iOSイベント処理ガイド

UIGestureRecognizer Class Reference

UISwipeGestureRecognizer Class Reference

UIView Class Reference

はじめての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 他

商品詳細を見る






5.1chホームシアターシステム
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
07 | 2017/08 | 09
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

5.1chホームシアターシステム
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