2012-11-07 19 views
13

我試圖忽視UITapGestureRecognizer水龍頭上,使用下列一個UITableView:shouldReceiveTouch上UITableViewCellContentView

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

它不會編譯:「未聲明的標識符‘UITableViewCellContentView’

無證類的使用需求??子類來完成這更好的方式

感謝所有幫助

回答

39

這似乎做到這一點:

- (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 
} 
+1

這在ios7打破。 touch.view.superView == UITableViewCellScrollView – Legolas

+1

正如Legolas提到的,在iOS7上被破壞。隨着層次結構的變化,需要進行第四次檢查。 .superview.superview.superview也必須檢查! –

+2

我在'iOS 7.0版本上觸發'touch.view.superview.superview' => **第三次檢查** ... –

4

我剛剛過這個問題來了,下面的解決方案適用於所有iOS版本,而不必蘋果改變的tableView的視圖層次的風險。 Basicaly,保留對你的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. 
+0

感謝您的解決方案。在iOS8中,他們再次改變了UITableView的視圖層次結構。 – masam

10

你可以這樣做。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
    { 
     if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) { 
      return NO; 
     }else{ 
      return YES; 
     } 
    } 
+0

這是一個非常迷人的方式,當然值得多選票。 –

+0

非常好,很高興知道更多關於此 – vib

2

下面是所選答案的快速解決方案。

我無法使用「MyTableView」命名的依賴項檢查,因爲我有許多視圖控制器派生自定義的BaseViewController。一些視圖控制器具有桌面視圖,一些視圖控制器具有集合視圖或兩者,但是在所有情況下,手勢識別器都會竊取他們的觸摸。

我不想把這個手勢在每個子類中處理代碼,所以我得到了它在基類工作的唯一方法是這樣的:

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 
    } 

} 
相關問題