2012年7月31日火曜日

iOS端末でマルチタッチを検知して処理する

このエントリーをはてなブックマークに追加
iPhoneやiPadなどのiOS端末でタッチイベントをキャッチするときはtouchesBegan等のメソッドを利用します。マルチタッチされたかどうかはこのメソッドの引数を利用して知ることができます。ここではマルチタッチを検知して処理する方法を書いています。


処理方針
まず、マルチタップを行える状態にします。UIViewが持っているプロパティのmultipleTouchEnabledをYESにすることでマルチタップが行えるようになります。このプロパティはデフォルトではNOとなっています。 

次に、touchesBeganのメソッド引数であるtouchesから複数のタッチを検出します。Objective-Cでは列挙子と呼ばれる仕組みが使えるようなので、それを利用してタッチ情報を順番に取得します。


プログラム
iPhoneでのタッチやタップをtouchesBeganで検知するで作成したBaseWindowクラスにinitWithFrameメソッドを追加し、UIWindow(UIViewのサブクラス)のインスタンスが作成されるタイミングでYESにするようにしました。また、touchesBeganを修正し、タッチされた数とタッチされた全ての位置をログに出力するようにしました。

BaseWindow.m
- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self != nil) {
        self.multipleTouchEnabled = YES;
    }
    
    return self;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSInteger touchCount = [touches count];
    NSLog(@"touchesBegan: count = %d", touchCount);
    
    NSEnumerator *enumulator = [touches objectEnumerator];
    UITouch *touchObject;
    while (touchObject = [enumulator nextObject]) {
        CGPoint tmpLocation = [touchObject locationInView:self];
        NSLog(@"touchesBegan: (x, y) = (%.0f, %.0f)", tmpLocation.x, tmpLocation.y);
    }
}


実行結果
 iPhoneシミュレータでのマルチタッチは、シミュレータ画面上で[option]キーを押したままにすることでできます。カーソルが2つ現れるので、動かすことでピンチイン、ピンチアウト等ができます。マルチタッチの実行結果は次のとおりでした。
2012-07-30 00:39:44.320 HelloWorld[13321:f803] touchesBegan: count = 2
2012-07-30 00:39:44.324 HelloWorld[13321:f803] touchesBegan: (x, y) = (145, 155)
2012-07-30 00:39:44.325 HelloWorld[13321:f803] touchesBegan: (x, y) = (175, 325)

0 件のコメント:

コメントを投稿