2012-07-10 27 views
5

我知道這個問題必須被回答很多次,但它現在真的讓我頭痛。我的UIView中沒有調用touchesBegan:。在我將它添加到我的應用程序之前,我先做了一個試驗項目。在試驗項目中,一切都很完美。我所做的就是創建一個UIView子類,其中touchesBegan:正在實現,並將此UIView作爲另一個視圖的子視圖添加。這第二個視圖有一個按鈕,顯示一旦點擊後的子類UIView。再一次,一切都按照我想要的方式工作。touchesBegan在UIView不被稱爲

現在,當我在我現有的應用程序中做同樣的事情時,touchesBegan:方法(以及touchesMoved:)永遠不會被調用。任何人都可以向我解釋爲什麼?我只是不明白爲什麼它從來沒有被稱爲。

+1

爲您的視圖使用戶交互? – alinoz 2012-07-10 11:45:44

+0

當我啓用用戶交互時,它仍然無法識別觸摸。儘管如此,在我的試用項目中,我甚至沒有啓用用戶交互,但它仍然認識到觸摸。 – 2012-07-11 01:05:06

回答

7

我剛剛找到答案。我忘了提及視圖是在另一個UIView中,userInteraction被禁用(它在默認情況下被禁用)。所以當我啓用這個視圖的userInteraction時,觸摸現在被識別。

1

在我的情況下,background = UIColor.clearColor()是沒有調用touchesBegan的原因。它顯然不需要透明元素。

0

我在這個問題上苦苦掙扎了一段時間......我弄明白了。我認爲touchesBegan覆蓋函數監聽主視圖:第一個在ViewController的故事板樹上!我很想發佈一個我的故事板圖像更清晰,但我不能! ;)

無論如何,IF你有子視圖,他們可能會覆蓋主視圖...在這種方式觸摸將不會「達到」主視圖。

爲了避免這種情況,你必須設置背景財產在屬性檢查器默認所有子視圖。通過這種方式,背景將是透明的,觸摸將能夠達到主視圖。

如果你不想將背景設置爲透明有一些東西,你可以這樣做:

- 增加你的最後一個視圖的出口(背景組)

- 添加雙擊手勢識別

- 把手水龍頭配置鍵盤

ES。

在性能:

//The last view's outlet 
@IBOutlet weak var ContainerView: UIView! 

在viewDidLoad中():

let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
self.ContainerView.addGestureRecognizer(tap) 

外:

func handleTap(recognizer: UITapGestureRecognizer){ 
    self.view.endEditing(true) 
}