2010-03-30 101 views
3

我正在iPhone上開發一個簡單的遊戲,我開始使用基於視圖的應用程序,並且通過UIViewController我加載了一個包含更多UIView和某些UIImageView s的自定義UIView。我想檢測一些UIImageView上的觸摸事件,但目前爲止我還沒有做到。如何檢測UIViews深層次內的UIImageView上的觸摸事件?

我已經創建了用於測試的第二個項目,並想通UIImageView S手觸摸事件時的層次結構是這樣的:

UIViewController - >UIView - >UIImageView

但是當它就像:

UIViewController - >UIView - >UIView - >UIImageView

沒有檢測到它們。

注:
- userInteractionEnabled在所有情況下
YES - 所有UIViewsUIImageViews我上面提的是自定義的子類。

你能想到任何原因:當自定義UIImageView在視圖層次中變得更深時,無法接收觸摸事件?

回答

4

觸摸需要漫長而迂迴的路線到達目的地。正式的,他們上了響應者鏈,從第一響應者開始,然後從最深的觸摸包括視圖到視圖控制器,再到下一個觸摸視圖等。

但是真正的圖像更加複雜,因爲在找到最深的觸摸包括視圖時,觸摸本質上通過調用hitTest:withEvent:方法來「詢問」該信息的最高級視圖。這允許一些超級視圖劫持觸摸,這可能非常有用,如在UIScrollView中,它有時在其子視圖之前做事(滾動/縮放)知道發生了什麼。

這裏有一些提示,以幫助確定爲什麼一個視圖可能不會響應觸摸:在你的每一個意見和NSLog

  • 覆蓋[hitTest:withEvent:] 1當他們被打到,看看誰正在考慮響應者鏈。
  • 使用未公開的(因此提取之前提交)UIView方法recursiveDescription在運行時檢查所有視圖的幀。默認情況下,視圖顯示超出其框架尺寸,因此視圖可能會顯示正常,但在邏輯上比視覺尺寸更小 - 並且觸摸基於邏輯(不可視)尺寸進行響應。
  • 這可能聽起來很愚蠢,但仔細檢查你的方法是否正確連接到你正在尋找的輸出。例如,如果您希望在觸摸UIButton時調用了 - [MyClass buttonPressed]方法,請仔細檢查是否已將MyClass實例和@selector(buttonPressed)作爲該按鈕的目標/操作對添加。
  • 如果這些工作都不起作用,請使用NSLog消息覆蓋touchesBegan:withEvent:以查看觸摸在響應器鏈中的位置。

而且,您已經知道這一點,但請注意標記爲userInteractionEnabled

希望這足以解決問題。

+2

首先感謝您的快速響應! 我只是有時間來檢查你的提示。問題是我沒有用'initWithFrame'初始化UIImageView。這是你的第二個提示,讓我懷疑這是問題所在:「視圖默認顯示超出其框架大小,所以它們可能看起來不錯,但在邏輯上比視覺尺寸更小 - 觸摸響應基於邏輯(不是視覺)尺寸。「 – jester 2010-04-01 07:31:47