ios开发碰到自定义导航栏leftBarButtonItems导致滑动返回失效问题解决方法

通常使用导航控制器 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

时间: 2024-10-03 10:06:20

ios开发碰到自定义导航栏leftBarButtonItems导致滑动返回失效问题解决方法的相关文章

ios开发Swift修改导航栏“返回”按钮文字,图标

项目中常常会使用 UINavigationController 对各个页面进行导航,导航栏左侧的返回按钮默认标题文字是上级页面的title. 但如果上级页面的标题很长,那么这个返回按钮字很多就会很丑:    开发Swift修改导航栏"返回"按钮文字,图标-swift 导航栏返回按钮">      当文字极其长时返回文字就会变成"back":         一,要修改"返回按钮"的文字,有如下两种方式: 1,在父页面中设置 将na

ios-iOS隐藏系统导航栏用自定义导航栏

问题描述 iOS隐藏系统导航栏用自定义导航栏 前提:1.navigationBarHidden = YES; 2.不要在每个ViewController中addSubView一次,继承父类的方法也不行. 就是想做一个绝对灵活的导航栏,高度不是44,样式也不是只有左右中三个部分.我听一个大神说这是iOS常识,让我查百度,可是我真的查不到,求助啊. 解决方案 iOS系统导航栏的自定义化 解决方案二: 给一个你想要视图作为导航栏不就行了? 解决方案三: 你自定义一个导航栏 隐藏系统的 再添加到UINa

React Native自定义导航栏

之前我们学习了可触摸组件和页面导航的使用的使用: 从零学React Native之09可触摸组件 - 从零学React Native之03页面导航 - 经过之前的学习, 我们可以完成一个自定义导航栏了, 效果如下: 我们需要创建一个 NaviBar.js 用来显示顶部的导航栏, 还需要四个界面(Page1.js,Page2.js,Page3.js,Page4.js). 当然还需要修改index.android.js或者index.ios.js 用来处理4个界面的切换. 导航栏NaviBar 实现

分别用ToolBar和自定义导航栏实现沉浸式状态栏

一.ToolBar 1.在build.gradle中添加依赖,例如: compile 'com.android.support:appcompat-v7:23.4.0' 2.去掉应用的ActionBar.可以是修改主题theme为"NoActionBar",例如: <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 或者不修改主题为"NoAct

SharePoint 2013 App开发中自定义网站栏,内容类型及列表

打开vs2012新建项目. 开发中自定义网站栏,内容类型及列表-sharepoint自定义列表"> 选择Sharepoint hosted模式. 一个app开发的项目就创建好了. 创建网站栏 1.右键项目>添 加>新建项>Site column 创建一个网站栏 2.在element.xml中添加以下 字段. <?xml version="1.0" encoding="utf-8"?> <Elements xmlns

iOS开发之自定义表情键盘(组件封装与自动布局)

下面的东西是编写自定义的表情键盘,话不多说,开门见山吧!下面主要用到的知识有MVC, iOS开发中的自动布局,自定义组件的封装与使用,Block回调,CoreData的使用.有的小伙伴可能会问写一个自定义表情键盘肿么这么麻烦?下面将会介绍我们如何用上面提到的东西来定义我们的表情键盘.下面的内容会比较多,这篇博文还是比较有料的. 还是那句话写技术博客是少不了代码的,下面会结合代码来回顾一下iOS的知识,本篇博文中用到的知识点在前面的博客中都能找到相应的内容,本篇算是一个小小的功能整合.先来张图看一

ios开发-IOS开发使用自定义字体路径问题求大神

问题描述 IOS开发使用自定义字体路径问题求大神 在项目开发中,我需要实现服务器管理UI风格,返回给我一个TTF格式的自定义字体包,我在加载里面的字体,问题就是服务器返给我的TTF字体包,我保存在沙盒里面读取不到.网上也找了很多资料,都没有答案,请问大神该怎么样解决.或者说我怎么把下载的字体加载到我的工程中 解决方案 http://blog.sina.com.cn/s/blog_9bf8abf301018pbr.html 解决方案二: iOS开发 - 使用自定义字体ios 使用自定义字体IOS使

IOS 开发之自定义按钮实现文字图片位置随意定制_IOS

IOS 开发之自定义按钮实现文字图片位置随意定制 可能有些看到这篇文章的朋友会觉得很不屑:"按钮谁不会自定义?还需要看你的?" 也确实,按钮是我们项目中最常见的控件之一,天天在使用.对于不同类型的按钮,我们是否有更加简便的方法来实现需求是我们需要做的.这里我提出自己的两种方法,您可以对你自己平时自定义按钮的方法做一下对比,看看哪种方法更加简单. 多说一句,千万不要觉得知识简单,觉得自己会了,没必要学习.'往往简单的东西存在大智慧'(这个比给满分),知识都是慢慢积累出来的. 按钮是应用中

IOS开发遇到的屏幕上下闪出黑边的解决方法

IOS开发遇到的屏幕上下闪出黑边的解决方法 在IOS开发时,使用的时IOS的模拟器,程序中任何有关坐标的地方也是根据屏幕获取的,而在IOS7的系统上运行,却发现屏幕小了一截,上下各闪出一块黑色区域.后经过查找原因,解决方法如下: 项目的App Icon and Launch Images设置中,本来是这样的: 点击Use Asset Catalog,之后点击Migrate,设置界面如下图模样: 这时在IOS7上就能充满屏幕了.