方案1
// 继承uinavigationcontroller,并获取到滑动返回手势
class NavigationController: UINavigationController {
/// 获取屏幕边缘侧滑手势
@objc func getScreenEdgePanGestureRecognizer() -> UIScreenEdgePanGestureRecognizer? {
var edgePan: UIScreenEdgePanGestureRecognizer?
if let recognizers = view.gestureRecognizers, recognizers.count > 0 {
for recognizer in recognizers {
if recognizer is UIScreenEdgePanGestureRecognizer {
edgePan = recognizer as? UIScreenEdgePanGestureRecognizer
break
}
}
}
return edgePan
}
}
在冲突的那个scrollview上添加手势关系
for (UIView *view in self.view.subviews) {
if ([view isKindOfClass:[UIScrollView class]]){
if ([self.navigationController isKindOfClass:[NavigationController class]]){
NavigationController *nav = (NavigationController *)self.navigationController;
UIGestureRecognizer *screenGes = [nav getScreenEdgePanGestureRecognizer];
UIScrollView *sc = (UIScrollView *)view;
[sc.panGestureRecognizer requireGestureRecognizerToFail:screenGes];
}
NSLog(@"");
break;
}
}
方案2
在有冲突的那个页面实现滑动返回手势的代理
self.navigationController?.interactivePopGestureRecognizer?.delegate = self
在手势代理中判断是否需要触发当前的滑动返回手势
extension MyController : UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// gestureRecognizer 即为当前的系统滑动返回手势
// otherGestureRecognizer也可能是其他的滑动返回手势,如wkwebview的H5页面后退,如果是则优先触发otherGestureRecognizer
if gestureRecognizer.isKind(of: UIScreenEdgePanGestureRecognizer.self) && false == otherGestureRecognizer.isKind(of: UIScreenEdgePanGestureRecognizer.self) {
otherGestureRecognizer.require(toFail: gestureRecognizer)
print("其他手势:\(otherGestureRecognizer)")
return false
}
return true
}
}
网友评论