14

次のUITableViewでのUITapGestureRecognizerタップを無視しようとしています。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
      if ([touch.view isKindOfClass:[UITableViewCellContentView class]]) {
          return NO; // ignore the touch
      }
      return YES; // handle the touch
}

コンパイルされません:「宣言されていない識別子の使用'UITableViewCellContentView'

文書化されていないクラス?サブクラス化する必要がありますか?これを達成するためのより良い方法は?

助けてくれてありがとう。

4

5 に答える 5

42

これはそれを行うようです:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if([touch.view isKindOfClass:[UITableViewCell class]]) {
         return NO;
    }
    // UITableViewCellContentView => UITableViewCell
    if([touch.view.superview isKindOfClass:[UITableViewCell class]]) {
         return NO;
    }
    // UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell
    if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) {
         return NO;
    }
    return YES; // handle the touch
}
于 2012-11-07T17:53:28.530 に答える
11

あなたはこれを行うことができます。

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
            return NO;
        }else{
            return YES;
        }
    }
于 2014-07-09T08:24:43.510 に答える
6

私はこの問題に遭遇したばかりで、次の解決策はすべてのiOSバージョンで機能し、AppleがtableViewのビュー階層を変更するリスクはありません。基本的に、UITableViewへの参照を保持します。

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
      if([touch.view isDescendantOfView:detailsTableView]) {
          return NO;
      }
      return YES;
   }

//isDescendantOfView:YES if the receiver is an immediate or distant subview of view or if view is the receiver itself; otherwise NO.
于 2014-03-25T10:45:15.910 に答える
2

選択した回答の迅速な解決策は次のとおりです。

多くのビューコントローラから派生したカスタムBaseViewControllerがあったため、依存関係チェックという名前の「MyTableView」を使用できませんでした。一部のビューコントローラにはテーブルビュー、一部にはコレクションビュー、またはその両方がありますが、すべての場合でジェスチャレコグナイザがタッチを盗みます。

このジェスチャ処理コードをすべてのサブクラスに配置したくなかったので、基本クラスで機能させる唯一の方法は次のとおりです。

extension BaseViewController: UIGestureRecognizerDelegate {

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
        var view = touch.view
        while view != nil {
            if view!.isKindOfClass(UICollectionView) || view!.isKindOfClass(UITableView) {
                return false
            } else {
                view = view!.superview
            }
        }
        return true
    }

}
于 2016-01-11T21:52:27.740 に答える
0

タッチ領域を確認する方がわかりやすく簡単だと思います。

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                       shouldReceive touch: UITouch) -> Bool {

    let point = touch.location(in: viewContentContainer)
    return !tableRules.frame.contains(point)
}
于 2019-08-02T13:10:47.117 に答える