美文网首页
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