2012-09-20 60 views
14

顯然,iOS 6會嘗試自動處理當手勢識別器和UIButton處於同一位置時的情況,並且會針對相同的手勢進行激活。處理iOS6中的手勢識別器

這種新的自動處理解決問題,當您想點擊按鈕,而不是激活手勢識別的,但當你想手勢識別行動創建一個新的問題

在iOS 5中,你可以實現:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

在衝突時動作轉移到UIButton

這似乎不適用於iOS 6.此外,反轉此方法的行爲(因爲現在UIButton具有優先級而不是手勢識別器)將不起作用。


Complete方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if ([touch.view isKindOfClass:[UIControl class]]){ 
     return NO; 
    } 
    return YES; 
} 
+0

你有一個uigesturerec uiview上有一個uibutton子視圖,並希望手勢識別器觸摸而不是按鈕? – Ahti

+0

是的。實際上,它是在單元格內具有「UIButtons」的「UITableView」,我希望手勢識別器被激活而不是按鈕。 – jturolla

+0

還沒有iOS完成這一切回到它的起源?我總是遇到按鈕下的問題。 –

回答

6

我做這個要解決這個問題,改變它,你認爲合適:在按鈕

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
     [self MyCommonSelector];// this will work for ios 5 
     return Yes; 
} 

添加目標,你聲明所以這將在iOS 6中稱:

[self.myButton addTarget:self action:@selector(MyCommonSelector) 
    forControlEvents:UIControlEventTouchUpInside]; 

做你的東西在這種方法,這也將被稱爲按鈕水龍頭和手勢,你需要打電話:

-(void)MyCommonSelector 
{ 
    //Do your stuff here what you want to do with Gesture too. 
} 
0

雖然我不知道你爲什麼會把UIButtons那裏,如果你不希望他們可挖,則可以防止從子視圖通過覆蓋接收觸摸-hitTest:withEvent:您包含視圖的方法。

-hitTest:withEvent:默認返回的「視圖層次結構(包括自身)的接收器,它包含一個指定的點最遠的後裔」,因此默認情況下,攻的一個按鈕時,你的含有視圖將返回按鈕。

你的實現應該是這個樣子:

- (UIView *)hitTest:(CGPoint)aPoint withEvent:(UIEvent *)event { 
    if ([self pointInside:aPoint]) { 
     return self; 
    } else { 
     return nil; 
    } 
} 

因此,如果這是被稱爲你的容器視圖包含觸摸點,則返回自身和與它相連的手勢識別器會得到觸摸。

因爲這個實現永遠不會返回任何子視圖,所以UIButtons都不會有機會響應觸摸。

+0

事實證明這不是一個好主意。 – jturolla

+2

你介意分享*爲什麼*? – Ahti

+0

我在通過這種方法隱藏的「彈出」中有一個按鈕。這個按鈕不會工作。 – jturolla

0

我知道它看起來很簡單,但你有沒有考慮將UIButton的userInteractionEnabled屬性設置爲「NO」?這應該從命中測試和手勢識別系統中自動移除它。

+0

現在這是一條好路徑。 – jturolla

+0

然後你可以標記我是正確的? – thebarcodeproject

+0

我很抱歉,我認爲這不是一條好路徑。 – jturolla