2013-10-06 62 views
1

我有一個UIView響應水龍頭(視圖A)。我有一個UITableViewController與UITableView(視圖B)。視圖B作爲子視圖添加到視圖A中,而視圖B的視圖B的面積小於視圖A.因此,如果用戶在視圖B內輕敲,則可以在表中選擇一行。如果他們在桌子外面點擊,但仍然在視圖A內,視圖A的反應不同(這是一個隱藏自己的抽屜)。子視圖沒有在iOS7中接收觸摸

這在iOS 5和6中運行良好。但是,在iOS7中,視圖B(UITableview)似乎從未接收到觸摸,行從未被選中,即使它是視圖A的子視圖。查看A的UITapGestureRecognizer,查看B然後開始獲取觸摸,並且用戶可以選擇表中的行(但視圖A現在不響應觸摸,因此這是不可接受的)

我的代碼沒有改變。有關iOS7中可能會出現什麼問題的任何想法?提前致謝!

+1

你好R,S ...我認爲這是一個自動佈局問題..也許你可以改變的可點擊的背景是,檢查具體在哪裏.. 工作過嗎? – Albara

+0

Hi R.S,你可以嘗試幾件事情:首先,如果UITableViewCell是由xib創建的,那麼嘗試再次編程地添加視圖B.其次,你可以嘗試繪製viewB和viewB.superview來檢查它們在那裏。 –

回答

2

您可以處理這幾種方法:

  1. 可以使用的UIGestureRecognizerDelegategestureRecognizerShouldBegin

    • 指定您的視圖控制器爲符合UIGestureRecognizerDelegate

      @interface ViewController() <UIGestureRecognizerDelegate> 
      
      ... 
      
      @end 
      
    • 指定您的視圖控制器實際上是敲擊手勢識別爲視圖A的delegate

      UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
      tap.delegate = self; 
      [self.viewA addGestureRecognizer:tap]; 
      
    • gestureRecognizerShouldBegin如果抽頭的位置由frameviewB包含返回NO:

      - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gesture 
      { 
          CGPoint point = [gesture locationInView:self.viewB.superview]; 
      
          return !CGRectContainsPoint(self.viewB.frame, point); 
      } 
      
  2. 或者,您可以對輕拍手勢進行子類化,並將其行爲更改爲立即失敗(即如果輕敲的位置與UITableView子視圖一致,則直接將狀態更改爲UIGestureRecognizerStateFailed)。

  3. 您也可以只在主視圖中添加一個子視圖,該視圖只覆蓋桌面視圖上方主視圖的空間,然後將輕擊手勢添加到該視圖中,這樣您就不必處理任何重疊的手勢識別器。

+0

Rob,感謝您的詳細解答。第一個建議就像一個魅力!第二個部分工作(視圖A不響應該手勢,但視圖B從來沒有得到它)​​。任何想法爲什麼這會在IOS7中打破? –

+0

@Rob具有諷刺意味的是,蘋果的官方方法指出哪些應該失敗(requireGestureRecognizerToFail :)在iOS7中被破解:(我通過Google b/c來到這裏,該方法在iOS7中完全被忽略,但在以前的IOS中完美工作) – Adam

+0

@ R.S我知道這是一個古老的問題,但我意識到我認爲第二種方法需要將手勢狀態改變爲手勢失敗/取消後纔會表現出您描述的行爲。我只是想讓你不必編寫自己的手勢識別器子類,但回想起來,如果你使用第二種方法,那就是你必須做的。我相應地修改了我的答案。底線,選項1(或我的新選項3)可能是最簡單的。 – Rob

相關問題