項目中遇到一個頁面中是以一個scrollview橫向Tab展示兩個不同功能的顯示,譬如消息和公告功能,但是由于滑動返回手勢和scrollview的滑動返回手勢沖突了,導(dǎo)致頁面不再能夠滑動返回。類似的還有圖片瀏覽功能也出現(xiàn)過。
為共和等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及共和網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)、共和網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
iOS系統(tǒng)中,滑動返回手勢,其實是一個UIPanGestureRecognizer,系統(tǒng)默認的操作是只有滑動屏幕的左邊的某個位置,UIPanGestureRecognizer才會起作用。UIScrollView的滑動手勢也是UIPanGestureRecognizer。那在側(cè)邊滑動時,讓UIScrollView的不響應(yīng)事件就OK了嘛,首先想到了繼承UIScrollView 重寫下面的方法,讓滑動側(cè)邊時scrollView不響應(yīng)事件,根據(jù)響應(yīng)者鏈,事件最終會傳遞給下方的滑動手勢。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if (point.x < location.x) { // location.x為系統(tǒng)的某個點的x return nil; } else { return [super hitTest:point withEvent:event]; } }
但是,這樣有個問題,就是在一個頁面不同tab時,也需要滑動切換,滑動返回。
由于scrollView的滑動手勢攔截了事件,那我重寫scrollView中panGestureRecognizer的代理方法,讓它不攔截就好了嘛。于是繼承UIScrollView,重寫下面的方法。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([self panBack:gestureRecognizer]) { return YES; } return NO; } - (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer == self.panGestureRecognizer) { UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer; CGPoint point = [pan translationInView:self]; UIGestureRecognizerState state = gestureRecognizer.state; if (UIGestureRecognizerStateBegan == state || UIGestureRecognizerStatePossible == state) { CGPoint location = [gestureRecognizer locationInView:self]; if (point.x > 0 && location.x < “這個自己設(shè)定" && self.contentOffset.x <= 0) { return YES; } } } return NO; }
需要側(cè)邊滑動時 panBack 返回YES,這時候,我讓scrollView的手勢和頁面的滑動返回手勢共存,scrollView不攔截手勢,那不就可以滑動返回了嗎。好了,測試一下,可以滑動返回,但是滑動返回時,為什么scrollView也跟著在滑動呢,太影響美觀了,看來還需要另外的辦法,我又回到了第一種辦法時的想法,讓scrollView切換的時候相應(yīng)panGesture,滑動返回的時候不響應(yīng),那重寫scrollView中的另外一個panGestureRecognizer的代理方法。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if ([self panBack:gestureRecognizer]) { return NO; } return YES; }
第二種方法:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { // 首先判斷otherGestureRecognizer是不是系統(tǒng)pop手勢 if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) { // 再判斷系統(tǒng)手勢的state是began還是fail,同時判斷scrollView的位置是不是正好在最左邊 if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) { return YES; } } return NO; }
以上的代碼都是在一個自定義的UIScrollView上的,重寫上面的方法即可。然后讓橫向滾動的scrollView繼承這個自定義UIScrollView就OK了。
原理:
scrollView的pan手勢會讓系統(tǒng)的pan手勢失效,所以我們只需要在系統(tǒng)手勢失效且scrollView的位置在初始位置的時候讓兩個手勢同時啟用就可以了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。