iOS 系统返回按钮事件拦截OC版本
系统返回按钮事件拦截
- 主要实现原理
// 如果你想使用的optional方法,你必须用@objc标记您的protocol
public protocol ShouldPopDelegate
{
func currentViewControllerShouldPop() -> Bool
}
extension UIViewController: ShouldPopDelegate
{
public func currentViewControllerShouldPop() -> Bool {
return true
}
}
extension UINavigationController: UINavigationBarDelegate
{
public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool
{
var shouldPop = true
// 看一下当前控制器有没有实现代理方法 currentViewControllerShouldPop
// 如果实现了,根据当前控制器的代理方法的返回值决定
// 没过没有实现 shouldPop = YES
let currentVC = self.topViewController
// if (currentVC?.responds(to: #selector(currentViewControllerShouldPop)))! {
shouldPop = (currentVC?.currentViewControllerShouldPop())!
// }
if (shouldPop == true)
{
DispatchQueue.main.async {
self.popViewController(animated: true)
}
// 这里要return, 否则这个方法将会被再次调用
return true
}
else
{
// 让系统backIndicator 按钮透明度恢复为1
for subview in navigationBar.subviews
{
if (0.0 < subview.alpha && subview.alpha < 1.0) {
UIView.animate(withDuration: 0.25, animations: {
subview.alpha = 1.0
})
}
}
return false
}
}
}
- 如何使用
// 如果需要拦截系统返回按钮就重写该方法返回 false
override func currentViewControllerShouldPop() -> Bool {
return false
}
- 如何禁用系统👉右滑返回手势
override func viewWillAppear(_ animated: Bool)
{
super.viewWillAppear(animated)
// 为当前控制器禁用👉右滑返回手势
if (navigationController?.responds(to: NSSelectorFromString("interactivePopGestureRecognizer")))! {
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
}
}
override func viewWillDisappear(_ animated: Bool)
{
super.viewWillDisappear(animated)
// 为其他控制器开启👉右滑返回手势
if (navigationController?.responds(to: NSSelectorFromString("interactivePopGestureRecognizer")))! {
navigationController?.interactivePopGestureRecognizer?.isEnabled = true
}
}
强烈推荐:超简单!!! iOS设置状态栏、导航栏按钮、标题、颜色、透明度,偏移等
https://github.com/wangrui460/WRNavigationBar
https://github.com/wangrui460/WRNavigationBar_swift
欢迎关注我的微博:wangrui460
网友评论
我在视图里写这个方法override func currentViewControllerShouldPop() -> Bool