美文网首页
Swift 踩坑笔记(四)—— 导航条中使用自定义按键的坑

Swift 踩坑笔记(四)—— 导航条中使用自定义按键的坑

作者: 黑羽肃霜 | 来源:发表于2018-08-24 16:46 被阅读58次

    自定义导航栏按钮遇到的问题

    • 添加自定义导航栏按钮
      • 如何初始化 UIBarButtonItem 避免踩坑
        • 导航栏的颜色都有被重新渲染(默认是蓝色)
        • 如果使用leftBarButtonItem替换成自定义的初始化后,滑动返回默认被禁用了,要怎么解决
        • 如果使用诸如 UIBarButtonItem.init(customView: customUIButton)初始化带来的问题
      • 一些 UI 出图的左上角/右上角边距和默认的不同,怎么处理

    通读参考文章


    如何初始化 UIBarButtonItem 避免踩坑

    简单的方法来说,是用下面这段代码来做初始化

    let barButton = UIBarButtonItem(image: UIImage.init(named: "icon_more_black")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(drawerTheDrawer))
    navigationItem.leftBarButtonItem = barButton
    

    这里几个说明

    • 我们经常会忘记,swift 其实是一个链式响应的,所以我们在一些导航栏(包括tabnav)添加一些自定义图片的时候,常常会碰到被渲染成系统的默认颜色了(比如导航栏变成蓝色,tab 栏黑色),所以我们初始化图片的时候,要带上这个参数:

      UIImage.init(named: "icon_more_black")?.withRenderingMode(.alwaysOriginal)
      

      alwaysOriginal表示使用图片原来的颜色,相对应的是alwaysTemplate使用模板色

    • 使用上面那段代码初始化UIBarButtonItem之后,通过leftBarButtonItem替换系统的返回按钮,会使滑动返回手势失效。文章开头提到参考链接中也给出了解决方案:

      class ViewController: UIViewController, UIGestureRecognizerDelegate, UINavigationControllerDelegate {
        override func viewDidLoad() {
            super.viewDidLoad()
           // 设置手势代理,启用手势
            navigationController?.interactivePopGestureRecognizer?.delegate = self;
            // 设置导航控制器代理
            navigationController?.delegate = self;
        }
        
        func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
            guard let nav = self.navigationController else {
                return;
            }
            // 只有一个根控制器的时候,禁用手势
            nav.interactivePopGestureRecognizer?.isEnabled =  nav.viewControllers.count > 1 ;
        }
      }
      

    一些 UI 出图的左上角/右上角边距和默认的不同,怎么处理

    通过使用上面提到的默认方式,我们从reveal中可以看到,相应区域的热区会自动形成。

    例如我提供了一个 这样的图片,他的大小只有 7 * 14,但是我们可以看到,他的相应热区是 36 * 44。如果使用了错误的初始化方式(如上面提到的使用UIBarButtonItem.init(customView: customUIButton)),会造成热区变小,用户直接的感受就是我好像一直点不到这个按钮。

    image.png

    如果用的是另外一种方式,那么他的相应宽度,就等于自身的宽度.(假设我给的图片是17*17,那么宽度就只有17)

    相关文章

      网友评论

          本文标题:Swift 踩坑笔记(四)—— 导航条中使用自定义按键的坑

          本文链接:https://www.haomeiwen.com/subject/olhiiftx.html