ios開發碰到自訂導覽列leftBarButtonItems導致滑動返回失效問題解決方案

來源:互聯網
上載者:User

通常使用導航控制器 navigationController 跳轉到另一頁面時,除了可以點擊左上方的返回按鈕,還可以通過在螢幕左側向右滑動來返回到上一層。但如果自訂了 self.navigationItem.leftBarButtonItems 後會發現,滑動返回(swipe back)失效了。
(如何自訂導覽列左側按鈕可以看這篇文章:Swift - 修改導覽列“返回”按鈕文字,表徵圖)


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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.