http://www.xiaoyaoli.com/?p=899
經過實驗發現iOS5和iOS6里面,輕點手勢和按鈕的點擊沖突機制是不同的,結果如下:
一個UIView上如果添加了一個按鈕,又添加了Tap手勢
在iOS5的設備上跑會只響應Tap手勢,按鈕不響應點擊事件,只會有higlighted效果
在iOS5的設備上跑,按住了按鈕,當過了3,4秒左右,跳過Tap手勢的識別,再松手,按鈕會響應
在iOS6的設備上跑,兩者不會沖突,按鈕可以點擊,非按鈕區域可以Tap手勢
結論就是iOS5和6之間對于事件響應關系是有區別對待的,而且tap響應時間過后,系統會開始判斷點擊按鈕,把剛才的長按理解為長期的touch down狀態。這樣處理我感覺很奇怪,萬全之策還是要解決沖突,因為首先響應Tap事件,所以處理Tap事件的代理方法,過濾掉UIButton的影響。
具體實現,首先添加UIGestureRecognizerDelegate協議,然后把 Tap手勢識別對象設置代理self,然后實現如下代碼:
– (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass:[UIButton class]]){
return NO;
}
return YES;
}
同理,其他的input事件也可以通過下面的代碼實現:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass:[UIControl class]]) {
// we touched a button, slider, or other UIControl
return NO; // ignore the touch
}
return YES; // handle the touch
}
1
2
3
4
5
6
7
8
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass:[UIControl class]]) {
// we touched a button, slider, or other UIControl
return NO; // ignore the touch
}
return YES; // handle the touch
}
比如UISlider:
-(BOOL)gestureRecognizer:(UIGestureRecognizer)gestureRecognizer shouldReceiveTouch:(UITouch)touch {
if([touch.view isKindOfClass:[UISlider class]])
{
return NO;
}else{
return YES;
}
}
再次重申,iOS6沒這個問題了
轉自 :作者 xiaoyao Li