import UIKit
class ScreenPanGestureRecognizerViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupInterface()
}
}
extension ScreenPanGestureRecognizerViewController {
private func setupInterface() {
setupGestureRecognizer()
}
private func setupGestureRecognizer() {
guard UIDevice.current.isPhone else { return }
// 以 iPhone SE 的 4 英寸为基准,大于这个尺寸宽度的才进行左侧边缘滑动返回手势的优化,扩大可触发的范围。
guard UIDevice.current.detailedModel.size.width > UIDevice.current.phone("SE").size.width else { return }
guard let target = navigationController?.interactivePopGestureRecognizer?.delegate else { return }
let sel = Selector(("handleNavigationTransition:"))
guard target.responds(to: sel) else { return }
let panGR = UIPanGestureRecognizer(target: target, action: sel)
panGR.delegate = self
view.addGestureRecognizer(panGR)
// 禁用系统自带的屏幕边缘滑动返回手势
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
// navigationController?.interactivePopGestureRecognizer?.delegate = self
}
}
extension ScreenPanGestureRecognizerViewController: UIGestureRecognizerDelegate {
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
// 当前视图控制器为 “根控制器” 时,则不触发滑动返回手势事件。
guard navigationController?.rootViewController != self else {
return false
}
let location = gestureRecognizer.location(in: view)
let width = view.bounds.width
// 以 iPhone SE 的 4 英寸为基准,大于这个尺寸宽度的才进行左侧边缘滑动返回手势的优化,扩大可触发的范围。
// 求出当前的差值,作为左侧滑动返回的可触发区域大小。
let factor = width - UIDevice.current.phone("SE").size.width
if location.x >= factor {
return false
}
return true
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if children.count == 1 {
return false
}
// 手势不能同时进行触发,防止例如 UITableView 上下滑动手势与滑动返回手势冲突。
return false
}
}
fileprivate extension UINavigationController {
var rootViewController: UIViewController? {
return viewControllers.first
}
}
自定义滑动返回手势的范围
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 背景介绍 : 在开发过程中,系统自带的某些功能,可能不满足我们的开发需求,所以常常需要我们自定义.当我们自定义导航...
- 在ios中,系统提供的导航栏返回按钮,会自动包含许多其他我们可能用不到的View导致最后呈现的效果不如所愿,最常见...
- 其实,上天给了我十万条理由让我去使用系统的导航栏,然而,仅仅只因为一条,我不得不放弃,我们坑爹的产品经理不喜欢。。...
- 1自定义导航按钮 会导致返回手势失效2自定义push 动画同样会导致返回手势失效3自定义导航按钮同样会导致自定义 ...