Swipes(1)~イベント処理メソッド

2012. 02. 26
Swipesは一本指での水平/垂直スワイプ動作を検出してラベルで表示します。

7824


●プロジェクトの作成

View-based Applicationテンプレートで、プロジェクト名を『Swipes』とします。

7815

7825


●SwipesViewController.hヘッダファイルの編集

指の移動をスワイプとする移動距離と許容変位、水平/垂直スワイプと認識されたことを表示するラベルのアウトレットと、スワイプの開始座標を保持するプロパティ、そして(表示から一定時間後に)ラベルを消去するメソッドの宣言を行います。
(太字が追加した部分)

#define kMinimumGestureLength 25
#define kMaximumVariance 5


#import <UIKit/UIKit.h>

@interface SwipesViewController : UIViewController {
    UILabel *label;
    CGPoint gestureStartPoint;

}

@property (nonatomic, retain) IBOutlet UILabel *label;
@property CGPoint gestureStartPoint;

- (void)eraseText;


@end

7826


1)定数

2つの定数はジェスチャ(指の動き)をスワイプとして認識するために必要な値を指定しています。

kMinimumuGestureLengthはスワイプと認識するために必要な移動距離を示すもので、ここでは25ピクセルに設定します。

kMaximumVarianceはスワイプと認識するために必要な許容変位を示すもので、ここでは5ピクセルに設定します。

つまりタッチされた始点から水平(垂直)方向に25ピクセル移動し、且つその誤差が垂直(水平)方向に5ピクセル以内であった場合にスワイプと認識されることになります。


2)アウトレット

ラベルlabelはジェスチャが水平または垂直のスワイプと認識された場合に表示するアウトレットです。


3)変数

変数gestureStartPointはジェスチャをスワイプと認識するために必要な始点座標を保持します。


4)メソッド

eraseTextメソッドは(表示から一定時間後に)ラベルを消去するメソッドです。


●SwipesViewController.xibの編集

SwipesViewController.hヘッダファイルの変更が終わったら保存し、ビューコントローラのnibファイルSwipesViewController.xibを開いてラベルの追加を行います。


1)ラベルの追加

LibraryウィンドウのLabelを選択し、Viewウィンドウの上方に1つラベルを設置します。

7827


2)ラベルへのアウトレットの接続

DocumentウィンドウでFile's Ownerを選択し、InspectorウィンドウでConnectionsタブを開き、OutletsのlabelをViewウィンドウのラベルに接続します。

7828


3)ラベルのサイズ変更

Documentウィンドウでラベルを選択し、InspectorウィンドウでSizeタブを開き、X:20、Y:20、W:280、H:21にサイズを変更します。


4)ラベルの属性変更

InspectorウィンドウのAttributesタブを開き、属性の変更を行います。

Label)

・Text
予め入っている文字列『Label』を削除します。
これにより初期状態では何も表示されないことになります。

・Layout:Alignment
文字列のレイアウトを左寄せから中央揃えに変更します。

7829


5)ビューの属性変更

DocumentウィンドウでViewを選択し、InspectorウィンドウでAttributesタブを開き、ViewのInteractionの『Multiple Touch』にチェックを入れます。
(今回に限っては一本指の動作検出なので実際には不要ですが、後に改変して複数指に対応するためにチェックを入れておきます)

この項目はUIViewクラスのmultipleTouchEnabledプロパティに相当します。

7830

全ての変更が済んだらnibファイルを保存します。


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

ヘッダファイルで宣言したプロパティの実装と、ラベルを消去するeraseTextメソッド、および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];
}
*/


// 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)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    gestureStartPoint = [touch locationInView:self.view];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint currentPosition = [touch locationInView:self.view];

    CGFloat deltaX = fabsf(gestureStartPoint.x - currentPosition.x);
    CGFloat deltaY = fabsf(gestureStartPoint.y - currentPosition.y);

    if (deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance) {
        label.text = @"Horizontal swipe detected";
        [self performSelector:@selector(eraseText) withObject:nil afterDelay:2];
    }
    else if (deltaY >= kMinimumGestureLength && deltaX <= kMaximumVariance) {
        label.text = @"Vertical swipe detected";
        [self performSelector:@selector(eraseText) withObject:nil afterDelay:2];
    }
}


@end

7835


1)プロパティの実装

ヘッダファイルで宣言した2つのプロパティlabelとgestureStartPointを@synthesizeで実装します。


2)eraseTextメソッド

eraseTextメソッドはラベルのテキストを消去するメソッドで、タッチ移動を検出するtouchesMoved:withEvent:メソッドから呼び出されます。

ここではtextプロパティでラベルの文字列を空に設定しているだけで、『表示から一定時間後に』という部分は後述するtouchesMoved:withEvent:メソッド側で行っています。


3)不要なメソッドの削除

テンプレートで自動生成されるメソッドの内、initWithNibName:bundle:loadViewメソッドは今回使用しないので削除します。

viewDidLoadメソッドは後で利用するので、コメントアウトのまま残しておきます。



4)shouldAutorotateToInterfaceOrientation:メソッド

shouldAutorotateToInterfaceOrientation:のコメントアウトを解除してデフォルトのまま実装しています。


5)viewDidUnloadメソッド


viewDidUnloadにObjective-Cオブジェクトのプロパティlabelの所有権放棄を追加しています。


6)deallocメソッド

deallocにObjective-Cオブジェクトのプロパティlabelの解放を追加しています。


7)touchesBegan:withEvent:メソッド

touchesBegan:withEvent:メソッドはビューに一本以上の指が触れた時に呼び出されるメソッドで、ここでは始点座標の保持を行っています。

タッチオブジェクトのセットからanyObjectメソッドで適切なオブジェクトを選抜し、そのオブジェクトからlocationInView:メソッドでビューにおける始点座標を取得します。


8)touchesMoved:withEvent:メソッド

touchesMoved:withEvent:メソッドはビューで一本以上の指が移動した時に呼び出されるメソッドで、ここでは移動中の現在の座標を始点座標と比較し、予め定数で指定した範囲のジェスチャであればスワイプとして認識し、ラベルを表示を行います。

まずタッチオブジェクトのセットからanyObjectメソッドで適切なオブジェクトを選抜し、そのオブジェクトからlocationInView:メソッドでビューにおける現在の座標を取得します。

次にx座標とy座標それぞれについて、始点座標と現在の座標との差の絶対値を取ります。

x座標の差分deltaXが認識距離(kMinimumGestureLength)以上で、且つy座標の差分deltaYが許容変位(kMaximumVariance)以内であれば水平スワイプとして認識します。

y座標の差分deltaYが認識距離以上で、且つx座標の差分deltaXが許容変位以内であれば垂直スワイプとして認識します。

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



参考文献

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 他

商品詳細を見る






bose_soundlink_revolve
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
03 | 2017/04 | 05
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 - - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

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

Wish List
WACOM


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

bose_soundlink_revolve
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