新增:
解決
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中的不同響應(yīng)
解決過程
1.使用自定義UIPanGestureRecognizer替換系統(tǒng)的手勢
//設(shè)置系統(tǒng)手勢不可用
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
//獲取手勢的代理對象
id target = self.navigationController.interactivePopGestureRecognizer.delegate;
//獲取手勢響應(yīng)的方法
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 手勢的響應(yīng)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
//當panGesture相應(yīng)失敗時助析,才響應(yīng)scrollView的拖動手勢
[otherGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer];
return YES;
}
4.UISlider的響應(yīng)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
//當拖動的是slider時犀被,該事件不讓panGesture手勢響應(yīng)
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è)邊響應(yīng)
- (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.一行代碼寡键,讓你的應(yīng)用中UIScrollView的滑動與側(cè)滑返回并存 TZPopGesture