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