自定义导航栏按钮遇到的问题
- 添加自定义导航栏按钮
- 如何初始化
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 其实是一个链式响应的,所以我们在一些导航栏(包括
tab
和nav
)添加一些自定义图片的时候,常常会碰到被渲染成系统的默认颜色了(比如导航栏变成蓝色,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)
),会造成热区变小,用户直接的感受就是我好像一直点不到这个按钮。
如果用的是另外一种方式,那么他的相应宽度,就等于自身的宽度.(假设我给的图片是17*17,那么宽度就只有17)
网友评论