2012-09-03 60 views
10

我的UIViewController對其中包含的UIScrollView我簡單的故事板iPad的項目,該項目被放置在整個表面(1024×768)。我創建了3個XIB文件,它們是我的應用程序在viewDidLoad中加載的UIViews,並將它們添加到UIScrollView中。這3個XIB文件中的每一個都只包含一個UIButton。上的UIScrollView和UIView的的成分[這是擺裏面的UIScrollView]檢測觸摸事件

這是層次結構:

〜UIViewController中(UIViewControllerClass是此 UIViewController類)

~~的UIScrollView(含有3個相同UIViews)

~~~的UIView(UIViewClass是此XIB文件的文件所有者)

~~~~ UIButton的

我想,我的UIViewControllerClass意識到兩個:觸摸上的任何地方UIScrollView的組件,如果在的UIScrollView UIScrollView的被觸摸時,如果裏面的UIButton的UIView的觸摸,有信息正是按鈕被觸摸。我在UIViewClass裏面創建了IBAction,以便在UIScrollView中的UIView裏觸及UIButton,並且當我在所有元素(UIViewController,UIView和UIScrollView)上設置User Interaction Enabled = YES時,就像它應該調用這個方法。

但在這一點上我UIViewControllerClass並不知道里面的觸摸發生的UIScrollView上的UIButton。我做了這樣的觸摸識別器:

UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouch)]; 
touch.numberOfTouchesRequired = 1; 

並將其添加到UIScrollView組件。通過這種方式,我能夠在UIViewControllerClass中檢測UIScrollView組件上的觸摸事件,但觸摸UIScrollView中的UIView中的UIButton的事件處理程序不再被調用。

所以,我需要在UIViewControllerClass有這兩個信息:在UIScrollView的組件

  • 觸摸作出
  • 觸摸上的UIButton在UIView的是裏面的UIScrollView(如果該按鈕被感動)製成

我想,將觸摸事件識別器附加到整個UIScrollView組件並不是解決方案,因爲它會禁用我在UIViewClass中編寫的所有觸摸事件處理程序。

我認爲解決方案是以某種方式觸及哪些在UIView內部的組件UIScrollView應發送到UIViewControllerClass,但我沒有找到一種方法來做到這一點。

如果有人能幫助我,我會非常感激。提前致謝。


[編輯#1:鄭答案】

雙擊手勢必須cancelsTouchesInView選項設置爲NO

我的情況之上,這條線解決一切問題:

touch.cancelsTouchesInView = NO; 

非常感謝鄭。

回答

17

我不知道這是否適用於你或沒有,但我已經給有關觸摸事件的答案裏面滾動視圖點擊這裏訪問量:

Dismissing the keyboard in a UIScrollView

的想法是告訴了滾動不吞噬滾動視圖區域內的所有輕擊手勢。

我會在這裏反正粘貼代碼,希望它能解決你的問題:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)]; 

// prevents the scroll view from swallowing up the touch event of child buttons 
tapGesture.cancelsTouchesInView = NO;  

[pageScrollView addGestureRecognizer:tapGesture]; 

[tapGesture release]; 

... 

// method to hide keyboard when user taps on a scrollview 
-(void)hideKeyboard 
{ 
    [myTextFieldInScrollView resignFirstResponder]; 
} 
+0

非常感謝!你的這個問題與我的無關,但包含一個非常重要的行,對於我來說,我不知道UITapGestureRecognizer具有 - cancelsTouchesInView。我不知道這個選項默認設置爲YES,現在當我將它設置爲NO時,我能夠在UIScrollView上檢測到觸摸,並且如果在UIScrollView中觸摸的元素具有觸摸處理程序,那麼該處理程序正在也叫。再次感謝你,你用這條線解決了我的問題。 – uerceg

3

你可以繼承你的UIScrollView並重寫方法- hitTest:withEvent:它是由系統調用,以確定哪個視圖將會處理該事件。無論何時調用它,都可以假定在滾動視圖內發生觸摸事件,並且通過調用超級實現,可以獲取通常會處理事件的視圖。

+0

非常感謝您的回答,但我查答案在我的當張還回答我的問題時,我嘗試了他爲我工作的解決方案。再次感謝! – uerceg

+0

這應該是正確的選擇。 – HongchaoZhang

+0

你可以在代碼中給出這個例子嗎? – user6631314

0

你可以捕捉任何類型的UIScrollView的手勢。確保你也處理一些默認屬性,就像設置cancelsTouchesInView屬性爲false,默認情況下是true。還給你的子視圖標記號以區分選擇器。 &也使他們的用戶交互爲真。

讓自來水= UITapGestureRecognizer(目標:自我,動作:

選擇(didTapByUser(_ :)))

相關問題