UIScreenEdgePanGestureRecognizer *rightEdgeGesture =
[[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self
action:@selector(handleRightEdgeGesture:)];
rightEdgeGesture.edges = UIRectEdgeRight;? ? ? ? ? // 右滑顯示
[self.view addGestureRecognizer:rightEdgeGesture];
但是如果存在UIScrollerView 使用UIScreenEdgePanGestureRecognizer實(shí)現(xiàn)側(cè)滑效果失效的問題
原因是因?yàn)榛瑒臃祷厥聦?shí)上也是由于存在已久的UIScreenEdgePanGestureRecognizer來識別并且相應(yīng)地枉昏,它直接與UINavigationController的view進(jìn)行了綁定响蓉,綁定的方法是寫在UINavgationController 的基類中的据沈,正如一下:
UIPanGestureRecongnizer -- bind-- UIScrollerView
UIScreenEdgePanGestureRecognizer --bind-- UINavigationController.view
滑動返回?zé)o法觸發(fā)潮尝,說明UIScreenEdgePanGestureRecongnizer并沒有接受到手勢事件纵菌。
根據(jù)蘋果的官方文檔說明 UIGestureRecongnizer 和UIview 是多對一的關(guān)系,UIGestureRecognizer 一定要和UIView進(jìn)行綁定才能發(fā)揮作用佑惠,因此UIGestureRecongnizer對于屏幕上的手勢事件,其接受順序和UIView的層次結(jié)構(gòu)是一致的腻扇,如下關(guān)系
UINavgataionController.view -->UIviewController.view -- > UIScrollerView.view -->screen and user'finger 既UIScrollView的panGestureRecognizer
先接受到了手勢事件,直接就處理而沒有往下傳遞實(shí)際上就是兩個手勢共存的問題
觸發(fā)手勢的時候因?yàn)閟crollview在上邊砾嫉,所以沒有往下傳遞
解決方案
UIGestureRecognizerDelegate 代理方法中包含幼苛,支持多個UIGestureRecongnizer共存,其中一個方法是
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
總結(jié)就是此方法返回YES,手勢事件會一直往下傳遞焕刮,不論當(dāng)前層次是否對該事件進(jìn)行響應(yīng)
UIScrollView本身是其panGestureRecognizer的delegate蚓峦,且apple君明確表明不能修改它的delegate
UIScrollView作為delegate,說明UIScrollView中實(shí)現(xiàn)了上文提到的shouldRecognizeSimultaneouslyWithGestureRecognizer方法济锄,返回了NO暑椰。創(chuàng)建一個UIScrollView的category,由于category中的同名方法會覆蓋原有.m文件中的實(shí)現(xiàn)荐绝,使得可以自定義手勢事件的傳遞一汽,如下:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]? && [otherGestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
return YES;
} else? {
return NO;
}
}
參考:
iOS 下如果存在UIScrollerView 使用UIScreenEdgePanGestureRecognizer實(shí)現(xiàn)側(cè)滑效果失效的問題