2013-08-03 86 views
1

我有一個子類UIView,姑且稱之爲TileView.m/hUIGestureRecognizer未能觸發的可能原因?

TileView.m,我有以下代碼:([setup]肯定被調用,我用斷點檢查)。

- (void)setup { 
    self.userInteractionEnabled = YES; 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(testPressed:)]; 
    [self addGestureRecognizer:tap]; 
} 

- (void)testPressed:(UITapGestureRecognizer *)sender { 
    NSLog(@"tap pressed"); 
} 

出於某種原因,當我點擊視圖時,不會調用testPressed方法!

奇怪的是,如果我的TileView類複製到空白的Xcode項目,並設置它在那裏,一切工作絕對沒問題。這是奇怪的,因爲手勢首先由子視圖和超級視圖處理 - 所以瓦片類不應受其超級視圖的影響。此外,該手勢完全包含在TileView課程中。

作爲參考,拼貼視圖嵌套在: Controller -> controller's view -> scroll view -> container view -> tile view模式中。

我曾嘗試沒有成功:

  • 設置userInteractionEnabled = YES上TileView及其所有子視圖。
  • 從代碼的其他部分刪除所有手勢識別器以避免干擾。
  • 設置tap.delegate = self然後實施gestureRecognizer:shouldRecognizeSimultaneously...總是return YES;

沒有運氣:/

的還有什麼可以走錯了任何的想法?或者我可以運行哪些測試來更詳細地瞭解問題?

編輯:更多細節

回想一下,平鋪視圖嵌套在:Controller -> controller's view -> scroll view -> container view -> tile view

如果我在控制器文件中添加手勢識別與:

[self.view addGestureRecognizer:tap] 

,然後使用[self.view hitTest:[sender locationInView:self.view] withEvent:nil];在事件處理程序,我可以看到,返回的視圖是一個UIScrollView而不是TileView正如所預期的。

此外,加入了手勢識別來代替self.scrollView工作正常,但停止工作,如果我把它添加到self.containerView(這是scrollView唯一的子視圖)。 containerViewuserInteractionEnabled = YES

+0

你忘了[tap setNumberOfTouchesRequired:1]; ? – 0x8badf00d

+0

我剛剛嘗試過 - 它不幸的是沒有完成這個訣竅。 –

+0

你確定'setup'方法被調用嗎? – msgambel

回答

7

如果視圖包含的子視圖爲UIImageView s,請記住,您必須明確地將userInteractionEnabled設置爲YES(默認值爲NO)。

否則,圖像視圖將阻止自來水到達上海華。

還有,記得設置觸摸次數。

+0

沒有任何子視圖是UIImageViews - (有一些UILabels和其他UIViews)。但是,即使當我遍歷子視圖並在所有這些子視圖上設置了'userInteractionEnabled = YES'時,它仍然不起作用。感謝您的意見。 –

0

您可能還想檢查一下,您是不是想重複使用不同視圖的UITapGestureRecognizer對象。

這似乎是可能的,因爲您只是將手勢附加到視圖,但最終視圖需要分配給手勢對象上的視圖屬性,因此將手勢對象添加到第二個視圖只會覆蓋首先。