UIGestureRecognizer と、関連するクラスを使う時には、複数のジェスチャが同時に動くときを考慮する必要があります。考慮しないと、ジェスチャが正しく働かなかったり、動いて欲しくないジェスチャが働いてしまったりします。

ジェスチャを制御する方法は2つあります。自分のジェスチャを無効にする方法と、相手のジェスチャを無効にする方法があります。

状況に合わせて使い分けるとよいでしょう。

自分のジェスチャを無効にする場合

自身のジェスチャを無効にする場合は、UIGestureRecognizergestureRecognizer:shouldReceiveTouch: を使います。

この場合、無効にしたい UIGestureRecognizer を持っている UIView (の派生クラス) で判断します。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    UIView *touchesView = [touch view];

    // 子Viewをタッチしていたら、自身のジェスチャを無効にする
    if ([touchesView isKindOfClass:[HogeView class]]) {
        return NO;
    }

    return YES;
}

相手のジェスチャを無効にする方法

相手のジェスチャを無効にする場合は、UIGestureRecognizergestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: を使います。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{

    return NO;
}

こちらの方が簡単のように見えますが、たまに罠があります。それは相手の UIGestureRecognizergestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:YES を返すようになっている場合、NO を返しても無効にならないのです。

その場合は、無理やり UIGestureRecognizerState を変更してやります。

#import <UIKit/UIGestureRecognizerSubclass.h>

//(中略)

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{

    if ("無効にしたいUIGestureRecognizerかどうかを判定") {
        otherGestureRecognizer.state = UIGestureRecognizerStateFailed;
    }

    return YES;
}