TouchExplorer

2012. 02. 25
QuartzFunGLFunでは、ビューへのタッチとドラッグを検出し、それに合わせて図形を描画していましたが、このようなタッチイベントの取得と応答について掘り下げてみます。

TouchExplorerはビューへのタッチイベントを取得し、現在のタッチ状況とタップ回数、そしてタッチポイント数(何本の指がタッチされているか)をラベルで表示します。

7814


●プロジェクトの作成

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

7815

7816


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

現在のタッチ状況とタップ回数、そしてタッチポイント数を表示する3つラベルのアウトレットと、タッチイベントの発生に応じてラベルを更新するメソッドの宣言を行います。
(太字が追加した部分)

#import <UIKit/UIKit.h>

@interface TouchExplorerViewController : UIViewController {
    UILabel *messageLabel;
    UILabel *tapsLabel;
    UILabel *touchesLabel;

}

@property (nonatomic, retain) IBOutlet UILabel *messageLabel;
@property (nonatomic, retain) IBOutlet UILabel *tapsLabel;
@property (nonatomic, retain) IBOutlet UILabel *touchesLabel;

- (void)updateLabelsFromTouches:(NSSet *)touches;


@end

7817

ラベルは画面での表示順と同じく、上から
・messageLabel:タッチ状況
・tapsLabel:タップ数
・touchesLabel:タッチポイント数
を示します。

updateLabelsFromTouches:メソッドは、タッチイベントの発生に応じてラベルに表示する文字列を更新するメソッドです。


●TouchExplorerViewController.xibの編集

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


1)ラベルの追加

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

7818


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

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

7819


3)ラベルのサイズ変更

Documentウィンドウで各ラベルを選択し、InspectorウィンドウでSizeタブを開き、下表のようにサイズを変更します。

LabelXYWH
messageLabel202028021
tapsLabel204928021
touchesLabel207828021


4)ラベルの属性変更

Documentウィンドウで各ラベルを選択し、InspectorウィンドウでAttributesタブを開き、属性の変更を行います。

Label)

・Text
予め入っている文字列『Label』を削除します。
これにより初期状態では何も表示されないことになります。
この項目はUILabelクラスのtextプロパティに相当します。

・Layout:Alignment
文字列のレイアウトを左寄せから中央揃えに変更します。
この項目はUILabelクラスのtextAlignmentプロパティに相当します。

・Highlighted
ラベルを強調表示にする際の色の設定です。
原著であるApress社のiOS 3.x版のサンプルコードでは『Default』になっていますが、iOS 4.3のテンプレートではiOS 4.x版のサンプルコードと同じく『White Color』になっています。
(使用しないので特に変更はしません)
この項目はUILabelクラスのhighlightedTextColorプロパティに相当します。

View)

・Mode
ビューのサイズが変更された時に画像をどのように配置するかの設定です。
原著であるApress社のiOS 3.x版のサンプルコードでは『Scale To Fill』になっていますが、iOS 4.3のテンプレートではiOS 4.x版のサンプルコードと同じく『Left』になっています。
(画像レイアウトの設定なので、特に変更はしません)
この項目はUIViewクラスのcontentModeプロパティに相当します。

7820


5)ビューの属性変更

DocumentウィンドウでViewを選択し、InspectorウィンドウでAttributesタブを開き、ViewのInteractionの『Multiple Touch』にチェックを入れます。

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

7821

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


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

ヘッダファイルで宣言した3つのプロパティの実装と、ラベルを更新するupdateLabelsFromTouches:メソッド、および4つのタッチイベントメソッドを追加します。
(太字が追加した部分)

#import "TouchExplorerViewController.h"

@implementation TouchExplorerViewController

@synthesize messageLabel;
@synthesize tapsLabel;
@synthesize touchesLabel;

- (void)updateLabelsFromTouches:(NSSet *)touches {
    NSUInteger numTaps = [[touches anyObject] tapCount];
    NSString *tapsMessage = [[NSString alloc] initWithFormat:@"%d taps detected", numTaps];
    tapsLabel.text = tapsMessage;
    [tapsMessage release];

    NSUInteger numTouches = [touches count];
    NSString *touchMsg = [[NSString alloc] initWithFormat:@"%d touches detected", numTouches];
    touchesLabel.text = touchMsg;
    [touchMsg release];
}


// 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.messageLabel = nil;
    self.tapsLabel = nil;
    self.touchesLabel = nil;

    [super viewDidUnload];
}

- (void)dealloc {
    [messageLabel release];
    [tapsLabel release];
    [touchesLabel release];

    [super dealloc];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    messageLabel.text = @"Touches Began";
    [self updateLabelsFromTouches:touches];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    messageLabel.text = @"Touches Cancelled";
    [self updateLabelsFromTouches:touches];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    messageLabel.text = @"Touches Stopped.";
    [self updateLabelsFromTouches:touches];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    messageLabel.text = @"Drag Detected";
    [self updateLabelsFromTouches:touches];
}


@end

7822


1)プロパティの実装

ヘッダファイルで宣言した3つのプロパティmessageLabel、tapsLabel、touchesLabelを@synthesizeで実装します。


2)updateLabelsFromTouches:メソッド

updateLabelsFromTouches:メソッドはラベルのテキストを更新するメソッドで、タッチイベントが発生する毎に呼び出されます。

ここでは3つのラベルの内、タップ回数を示すtapsLabelとタッチポイント数を示すtouchesLabelの更新を行っています。
(タッチ状況を示すmessageLabelは、呼び出し元であるタッチイベントメソッドで設定されます)

タップ回数)

まず、タッチオブジェクトのセットからanyObjectメソッドで適切なオブジェクトを選抜し、そのオブジェクトからtapCountプロパティでタップ回数を取得します。

そしてinitWithFormat:メソッドでタップ回数を含む文字列を生成し、textプロパティでラベルの文字列に設定します。

タッチポイント数)

タッチポイント数はタッチオブジェクトのセットの要素数で表されているので、要素数をcountメソッドで取得します。

以降はタップ回数と同様にinitWithFormat:メソッドでタッチポイント数を含む文字列を生成し、textプロパティでラベルの文字列に設定します。


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

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


4)shouldAutorotateToInterfaceOrientation:メソッド

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


5)viewDidUnloadメソッド


viewDidUnloadに3つのプロパティの所有権放棄を追加しています。


6)deallocメソッド


deallocに3つのプロパティの解放を追加しています。


7)4つのタッチイベントメソッド

タッチイベントに応答するメソッドは以下の4つです。

touchesBegan:withEvent::ビューに一本以上の指が触れた時に通知
touchesCancelled:withEvent::システムがタッチイベントをキャンセルした時に通知
touchesEnded:withEvent::ビューから指が一本以上離れた時に通知
touchesMoved:withEvent::ビューで一本以上の指が移動した時に通知

各タッチイベントメソッドでは、その内容に応じた状況の文字列をtextプロパティでタッチ状況を示すラベルに設定し、残り2つのラベルを更新するためupdateLabelsFromTouches:メソッドを呼び出します。



参考文献

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_soundsport_free
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
09 | 2017/10 | 11
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_soundsport_free
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