14

UIButtonどうやら iOS 6 は、ジェスチャ レコグナイザとが同じ場所にあり、同じジェスチャに対してアクティブ化されている場合に、状況を自動的に処理しようとするようです。

この新しい自動処理は、ジェスチャ認識エンジンをアクティブにする代わりにボタンをクリックする場合の問題を解決しますが、ジェスチャ認識エンジンを動作させたい場合は新しい問題を引き起こします。

iOS 5 では、以下を実装できます。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

UIButton競合が発生した場合にアクションを転送します。

これは iOS 6 では機能しないようです。また、このメソッドの動作を逆にしても (UIButtonジェスチャ レコグナイザーではなく が優先されるため)、機能しません。


完全な方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isKindOfClass:[UIControl class]]){
        return NO;
    }
    return YES;
}
4

3 に答える 3

6

この問題を回避するためにこれを行いました。適切と思われる場合は変更してください。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
      [self MyCommonSelector];// this will work for ios 5
      return Yes;
 }

宣言するボタンにターゲットを追加して、iOS6でこれが呼び出されるようにします。

[self.myButton addTarget:self action:@selector(MyCommonSelector)
  forControlEvents:UIControlEventTouchUpInside];

このメソッドで作業を行います。このメソッドは、ボタンタップでも呼び出され、呼び出す必要のあるジェスチャからも呼び出されます。

-(void)MyCommonSelector
 {
    //Do your stuff here what you want to do with Gesture too.
 }
于 2012-10-03T14:40:41.680 に答える
0

単純に見えることは知っていますが、UIButtonのuserInteractionEnabledプロパティを「NO」に設定することを検討しましたか?これにより、ヒットテストおよびジェスチャ認識システムから自動的に削除されます。

于 2012-09-20T19:39:14.017 に答える
0

タップしたくない場合にUIButtonをそこに配置する理由はわかりませんが-hitTest:withEvent:、含まれているビューのメソッドをオーバーライドすることで、サブビューがタッチを受け取らないようにすることができます。

-hitTest:withEvent:デフォルトでは、 「指定されたポイントを含むビュー階層 (それ自体を含む) 内のレシーバーの最も遠い子孫」を返すため、デフォルトでは、ボタンの 1 つをタップすると、含まれているビューがボタンを返します。

実装は次のようになります。

- (UIView *)hitTest:(CGPoint)aPoint withEvent:(UIEvent *)event {
    if ([self pointInside:aPoint]) {
        return self;
    } else {
        return nil;
    }
}

したがって、これが呼び出されているコンテナー ビューにタッチ ポイントが含まれている場合、それ自体が返され、それに接続されているジェスチャ レコグナイザーがタッチを取得します。

この実装はサブビューを返さないため、UIButton がタッチに応答する機会がありません。

于 2012-09-20T19:27:26.767 に答える