UINavigationItem+Extension.swift 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //
  2. // UINavigationItem+Extension.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2020/9/23.
  6. // Copyright © 2020 Fin. All rights reserved.
  7. //
  8. import UIKit
  9. // 如果第一个 item 是系统自带的 UIBarButtonItem ,则距离导航栏左右距离只有8
  10. // 自己定义的的则最少有16,太宽了
  11. // 所以先用 一个 fixedSpace UIBarButtonItem 先把距离给缩短点,
  12. // 然后用个 AlignmentRectInsetsOverridable 把自己的按钮往 左/右 挪动,减少距离
  13. // 用 HitTestSlopable 增加点击区域
  14. enum UINavigationItemPosition {
  15. case left
  16. case right
  17. }
  18. extension UINavigationItem {
  19. func setLeftBarButtonItem(item: UIBarButtonItem) {
  20. setBarButtonItems(items: [item], position: .left)
  21. }
  22. func setRightBarButtonItem(item: UIBarButtonItem) {
  23. setBarButtonItems(items: [item], position: .right)
  24. }
  25. func setBarButtonItems(items: [UIBarButtonItem], position: UINavigationItemPosition) {
  26. guard items.count > 0 else {
  27. self.leftBarButtonItems = nil
  28. return
  29. }
  30. var buttonItems = items
  31. if #available(iOS 11.0, *) {
  32. buttonItems.forEach { item in
  33. guard let view = item.customView else { return }
  34. item.customView?.translatesAutoresizingMaskIntoConstraints = false
  35. (item.customView as? HitTestSlopable)?.hitTestSlop = UIEdgeInsets(top: -10, left: -10, bottom: -10, right: -10)
  36. (item.customView as? AlignmentRectInsetsOverridable)?.alignmentRectInsetsOverride = UIEdgeInsets(top: 0, left: position == .left ? 8 : -8, bottom: 0, right: position == .left ? -8 : 8)
  37. item.customView?.snp.makeConstraints { make in
  38. make.width.equalTo(view.bounds.size.width > 24 ? view.bounds.width : 24)
  39. make.height.equalTo(view.bounds.size.height > 24 ? view.bounds.height : 24)
  40. }
  41. }
  42. buttonItems.insert(UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil), at: 0)
  43. }
  44. else {
  45. let spacer = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
  46. spacer.width = -8
  47. buttonItems.insert(spacer, at: 0)
  48. }
  49. if position == .left {
  50. self.leftBarButtonItems = buttonItems
  51. }
  52. else {
  53. self.rightBarButtonItems = buttonItems
  54. }
  55. }
  56. }