通常使用导航控制器 navigationController 跳转到另一页面时,除了可以点击左上角的返回按钮,还可以通过在屏幕左侧向右滑动来返回到上一层。但如果自定义了 self.navigationItem.leftBarButtonItems 后会发现,滑动返回(swipe back)失效了。
(如何自定义导航栏左侧按钮可以看这篇文章:Swift - 修改导航栏“返回”按钮文字,图标)
开发碰到自定义导航栏leftBarButtonItems导致滑动返回失效问题解决方法-leftbarbuttonitem">
1,让滑动返回继续有效
解决办法是让 ViewController 实现 UIGestureRecognizerDelegate 协议
import UIKit
class DetailViewController: UIViewController, UIGestureRecognizerDelegate {
override func viewDidLoad() {
self.title = "hangge.com"
let button = UIButton(type: .System)
button.frame = CGRectMake(0, 0, 65, 30)
button.setImage(UIImage(named:"back"), forState: .Normal)
button.setTitle("返回", forState: .Normal)
button.addTarget(self, action: "backToPrevious", forControlEvents: .TouchUpInside)
let leftBarBtn = UIBarButtonItem(customView: button)
//用于消除左边空隙,要不然按钮顶不到最前面
let spacer = UIBarButtonItem(barButtonSystemItem: .FixedSpace, target: nil,
action: nil)
spacer.width = -10;
self.navigationItem.leftBarButtonItems = [spacer,leftBarBtn]
//启用滑动返回(swipe back)
self.navigationController?.interactivePopGestureRecognizer!.delegate = self
}
//返回按钮点击响应
func backToPrevious(){
self.navigationController?.popViewControllerAnimated(true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
注意:启用滑动返回(swipe back)对当前 NavigationController 管理的所有 viewController 都有效。不需要每个 ViewController 都调用那个方法,我们只要保证它们在同一个 UINavigationController 里即可。
2,与webview手势冲突造成无法滑动返回
正常情况下通过上面的设置后就可以滑动返回了,但有时我们在页面内放置了一个 webview 并加载网页进来后,会发现滑动返回的功能又失效了。(webview如果没加载页面则没有这个问题)
问题原因:由于 webview 加载的这个页面自身内部需要用到手势操作,或者 webview 放大之后需要一些滑动查看操作,于是便造成事件冲突。
解决办法:新建了一个 tap手势,设置代理,同时实现允许多个手势并发的代理方法
import UIKit
class DetailViewController: UIViewController, UIGestureRecognizerDelegate {
@IBOutlet weak var webView: UIWebView!
override func viewDidLoad() {
self.title = "hangge.com"
let urlobj = NSURL(string:"http://www.hangge.com")
let request = NSURLRequest(URL:urlobj!)
webView.loadRequest(request);
let button = UIButton(type: .System)
button.frame = CGRectMake(0, 0, 65, 30)
button.setImage(UIImage(named:"back"), forState: .Normal)
button.setTitle("返回", forState: .Normal)
button.addTarget(self, action: "backToPrevious", forControlEvents: .TouchUpInside)
let leftBarBtn = UIBarButtonItem(customView: button)
//用于消除左边空隙,要不然按钮顶不到最前面
let spacer = UIBarButtonItem(barButtonSystemItem: .FixedSpace, target: nil,
action: nil)
spacer.width = -10;
self.navigationItem.leftBarButtonItems = [spacer,leftBarBtn]
//启用滑动返回(swipe back)
self.navigationController?.interactivePopGestureRecognizer!.delegate = self
//新建一个滑动手势
let tap = UISwipeGestureRecognizer(target:self, action:nil)
tap.delegate = self
self.webView.addGestureRecognizer(tap)
}
//返回true表示所有相同类型的手势辨认都会得到处理
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer:
UIGestureRecognizer) -> Bool {
return true
}
//返回按钮点击响应
func backToPrevious(){
self.navigationController?.popViewControllerAnimated(true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
原文出自:www.hangge.com