Hatena::Groupiphone-dev

Ni chicha, ni limona - 平均から抜けられない僕

2009-06-08

[iPhone][Develop] 自前でピンチイン/ピンチアウトを実現する 22:12  [iPhone][Develop] 自前でピンチイン/ピンチアウトを実現する - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [iPhone][Develop] 自前でピンチイン/ピンチアウトを実現する - Ni chicha, ni limona - 平均から抜けられない僕  [iPhone][Develop] 自前でピンチイン/ピンチアウトを実現する - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

日本のiPhone SDK本ではあまり書かれていない、ピンチインやピンチアウト(写真を拡大したりするときのアレですね)を実現する方法をメモとして残しておきます。


タッチ開始と動いたときにNotifyされるメソッドでの処理が肝です。


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if ([touches count] == 2) {
        NSArray *twoTouches = [touches allObjects]; // 全タッチ情報を取得
        UITouch *first = [twoTouches objectAtIndex:0];
        UITouch *second = [twoTouches objectAtIndex:1];
        initialDistance = distanceBetweenPoints( // タッチ開始位置を記録
            [first locationInView:self.view],
            [second locationInView:self.view]);
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if ([touches count] == 2) {
        NSArray *twoTouches = [touches allObjects]; // 全タッチ情報を取得
        UITouch *first = [twoTouches objectAtIndex:0];
        UITouch *second = [twoTouches objectAtIndex:1];
        CGFloat currentDistance = distanceBetweenPoints( // タッチ位置
            [first locationInView:self.view],
            [second locationInView:self.view]);

        if (initialDistance == 0.0f) { // 最初が同じ点なら距離を更新
            initialDistance = currentDistance;
        } else if (currentDistance - initialDistance > kMinimumPinchDelta) {
            NSLog(@"ピンチアウトを検出");
            // よしなに色々なことをする
        } else if (initialDistance - currentDistance > kMinimumPinchDelta) {
            NSLog(@"ピンチインを検出");
            // よしなに色々なことをする
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    initialDistance = 0.0f; // 距離をリセット
}

ここでの距離を計算する関数はともかくとして、マクロ定数がどれくらいを適当な値とするか、自分のアプリでの使い勝手をみて調整するのが良いと思います。

タッチしている数を調べて、あとは距離を測るだけというけっこう簡単な内容ですね。touchesのオブジェクト順が心配であれば、ポインタの値を覚えておくのも良いと思います。

(同じ指でのタッチイベントは同じポインタでイベントが発生します)


ちなみにこのコード、洋書「Beginning iPhone Development」で紹介されているコードをベースにしています。この本では、他にもスワイプやチェックジェスチャの認識方法なども書かれていますので、そのあたりが気になる方は購入をお勧めします。

iPhone 2.2.1までの集大成的な本になっていますよ。


ここでなぜかボクのAmazonストアのリンクを貼っておきますが、まあそのアレです、察してください。


  Website Temporarily Unavailable