一鍵解決自定義返回按鈕側(cè)滑pop手勢失效及VC子視圖中包含UIScrollView等的不響應問題

新增:

解決

1.解決其他的對viewController中手勢通過實現(xiàn)手勢代理方法處理,造成手勢方法不識別,而出現(xiàn)的崩潰。----2018.09.01

2.WKWebView.allowsBackForwardNavigationGestures = YES 時,WKWebView返回手勢和側(cè)滑手勢的沖突----2018.04.18

解決思路

>使用自定義手勢替換系統(tǒng)的側(cè)滑手勢

>target 及 action 不變

>將自定義手勢添加到UIVIewController的view上,實現(xiàn)手勢在不同vc中的不同響應

解決過程

1.使用自定義UIPanGestureRecognizer替換系統(tǒng)的手勢

//設(shè)置系統(tǒng)手勢不可用

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

//獲取手勢的代理對象

id target = self.navigationController.interactivePopGestureRecognizer.delegate;

//獲取手勢響應的方法

SEL backGestureSelector = NSSelectorFromString(@"handleNavigationTransition:");

panGesture = [[UIPanGestureRecognizer alloc]initWithTarget:target action:backGestureSelector];

2.添加并設(shè)置手勢的代理為當前VC

if ([self.navigationController.? respondsToSelector:@selector(interactivePopGestureRecognizer)]) {

//使用自定義的手勢替換系統(tǒng)的側(cè)邊觸發(fā)手勢

//設(shè)置手勢的代理

[self syPanGesture].delegate = (self.sy_interactivePopDisabled == YES) ? nil : self;

//將自定義手勢添加到vc的view上

[self.view addGestureRecognizer:[self syPanGesture]];

? }

3.UIScrollView 手勢的響應

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

//當panGesture相應失敗時,才響應scrollView的拖動手勢

[otherGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer];

return YES;

}

4.UISlider的響應

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

//當拖動的是slider時,該事件不讓panGesture手勢響應

if ([touch.view isKindOfClass:[UISlider class]]) {

return NO;

}

return YES;

}

5.拖動中其他狀態(tài)的處理

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {

if ([[self.navigationController valueForKey:@"_isTransitioning"] boolValue]) {

return NO;

}

if ([self.navigationController.transitionCoordinator isAnimated]) {

return NO;

}

if (self.navigationController.viewControllers.count < 2) {

return NO;

}

return YES;

}

6.實現(xiàn)全屏和側(cè)邊響應

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {

if ([[self.navigationController valueForKey:@"_isTransitioning"] boolValue]) {

return NO;

}

if ([self.navigationController.transitionCoordinator isAnimated]) {

return NO;

}

if (self.navigationController.viewControllers.count < 2) {

return NO;

}

// 側(cè)滑手勢觸發(fā)位置

CGPoint location = [gestureRecognizer locationInView:self.view];

CGPoint offSet = [gestureRecognizer translationInView:gestureRecognizer.view];

//觸發(fā)寬度,

CGFloat maxLocationX = self.sy_isFullPopGesture == YES ? CGRectGetWidth(self.view.bounds) : 40.f;

//當是全屏返回手勢時,使用整個寬度

BOOL ret = (0 < offSet.x && location.x <= maxLocationX);

return ret;

}

代碼Demo

GitHub :SYPopGesture

參考資料

1.全屏返回手勢 FDFullscreenPopGesture

2.一行代碼,讓你的應用中UIScrollView的滑動與側(cè)滑返回并存 TZPopGesture

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容