Skip to content

Commit 85d0b1a

Browse files
authored
Merge pull request #10 from funzin/refactoring
Refactoring
2 parents 53efb27 + ef8fa74 commit 85d0b1a

File tree

5 files changed

+77
-87
lines changed

5 files changed

+77
-87
lines changed

StackBarButtonItem/Source/DeviceExtension.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ extension UIDevice {
55
var isPhone: Bool {
66
return self.userInterfaceIdiom == .phone
77
}
8-
8+
99
var isPad: Bool {
1010
return self.userInterfaceIdiom == .pad
1111
}
12-
12+
1313
var isPlus: Bool {
1414
if isPhone {
1515
let height = UIScreen.main.nativeBounds.height

StackBarButtonItem/Source/StackBarButtonItem.swift

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import UIKit
22
import RxSwift
33
import RxCocoa
44

5-
65
public final class StackBarButtonItem {
76
/// NavigationBarButtonItem Position
87
///
@@ -12,27 +11,26 @@ public final class StackBarButtonItem {
1211
case right
1312
case left
1413
}
15-
14+
1615
/// dispose variable
1716
private var compositeDisposable = CompositeDisposable()
1817
private let disposeBag = DisposeBag()
19-
18+
2019
/// use in navigation margin setting
2120
private let marginItem: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
22-
21+
2322
private weak var navigationItem: UINavigationItem?
24-
private let position: BarButtonPosition
25-
23+
private let position: BarButtonPosition
24+
2625
init(navigationItem: UINavigationItem, position: BarButtonPosition) {
2726
self.navigationItem = navigationItem
2827
self.position = position
2928
}
3029
}
3130

32-
3331
// MARK: public method
34-
public extension StackBarButtonItem{
35-
32+
public extension StackBarButtonItem {
33+
3634
/// Set stackView on the right or left side of the navigation bar
3735
///
3836
///
@@ -44,12 +42,12 @@ public extension StackBarButtonItem{
4442
/// - animated: Animation flag
4543
func setStackBarButtonItems(views: [UIView], spacing: CGFloat = 0, margin: CGFloat = 0, reversed: Bool = false, animated: Bool = false) {
4644
disposeAll()
47-
45+
4846
var items: [UIBarButtonItem] = []
4947
if !views.isEmpty {
5048
items = configureItems(views: views, spacing: spacing, margin: margin, reversed: reversed, animated: animated)
5149
}
52-
50+
5351
switch self.position {
5452
case .right:
5553
self.navigationItem?.setRightBarButtonItems(items, animated: animated)
@@ -61,20 +59,20 @@ public extension StackBarButtonItem{
6159

6260
// MARK: private method
6361
private extension StackBarButtonItem {
64-
62+
6563
/// compositeDisposable dispose and assign CompositeDisposable
6664
func disposeAll() {
6765
if compositeDisposable.count != 0 {
6866
compositeDisposable.dispose()
6967
compositeDisposable = CompositeDisposable()
7068
}
7169
}
72-
70+
7371
func addDisposable(_ disposable: Disposable) {
7472
_ = compositeDisposable.insert(disposable)
7573
disposable.disposed(by: disposeBag)
7674
}
77-
75+
7876
/// Configure UIBarButtonItems
7977
///
8078
///
@@ -85,16 +83,16 @@ private extension StackBarButtonItem {
8583
/// - reversed: Switch view order
8684
/// - animated: Animation flag
8785
/// - Returns: configured items
88-
func configureItems(views: [UIView], spacing: CGFloat = 0, margin: CGFloat = 0, reversed: Bool = false, animated: Bool = false) -> [UIBarButtonItem]{
86+
func configureItems(views: [UIView], spacing: CGFloat = 0, margin: CGFloat = 0, reversed: Bool = false, animated: Bool = false) -> [UIBarButtonItem] {
8987
let views = reversed ? views.reversed(): views
90-
88+
9189
let baseStackView = createBaseStackView(barButtonPosition: self.position, views: views, spacing: spacing, margin: margin)
9290
let items = convertIntoItems(baseStackView)
93-
91+
9492
congifureNavigationMargin(barButtonPosition: self.position, childStackView: baseStackView)
9593
return items
9694
}
97-
95+
9896
/// Create BaseStackView to embed in BarButtonItem. baseStackView includes childStackView(views and spacing) and margin view
9997
/// - Parameters:
10098
/// - barButtonPosition: right or left
@@ -105,14 +103,14 @@ private extension StackBarButtonItem {
105103
func createBaseStackView(barButtonPosition: BarButtonPosition, views: [UIView], spacing: CGFloat = 0, margin: CGFloat = 0) -> UIStackView {
106104
let childStackView = createChildStackView(views: views, spacing: spacing)
107105
let baseStackView = UIStackView(arrangedSubviews: [childStackView])
108-
106+
109107
baseStackView.configure(spacing: 0)
110108
baseStackView.addMarginView(barButtonPosition: self.position, margin: margin)
111109
baseStackView.updateFrameSize()
112-
110+
113111
return baseStackView
114112
}
115-
113+
116114
/// Create childStackView. childStackView includes views and spacing
117115
/// - Parameters:
118116
/// - views: An array of views to display on the right or left side of the navigation bar
@@ -122,10 +120,10 @@ private extension StackBarButtonItem {
122120
let childStackView = UIStackView(arrangedSubviews: views)
123121
childStackView.configure(spacing: spacing)
124122
childStackView.updateFrameSize()
125-
123+
126124
return childStackView
127125
}
128-
126+
129127
/// Configure navigationMargin
130128
///
131129
/// - Parameters:
@@ -138,7 +136,7 @@ private extension StackBarButtonItem {
138136
configureMinusMargin()
139137
}
140138
}
141-
139+
142140
/// Convert stackView(customView) into BarButtonItem
143141
///
144142
/// - Parameter stackView: CustomView of BarButtonItem
@@ -154,18 +152,17 @@ private extension StackBarButtonItem {
154152
}
155153
}
156154

157-
158155
// MARK: iOS11 or later private method
159156
@available(iOS 11, *)
160157
private extension StackBarButtonItem {
161-
158+
162159
/// Hide extra margin view
163160
///
164161
/// - Parameters:
165162
/// - barButtonPosition: right or left
166163
/// - childStackView: StackView for embedding in BarButtonItem
167164
func hideExtraMarginView(_ barButtonPosition: BarButtonPosition, _ childStackView: UIStackView) {
168-
165+
169166
let disposable = childStackView.rx.methodInvoked(#selector(UIView.didMoveToSuperview))
170167
.observeOn(ConcurrentMainScheduler.instance)
171168
.flatMap { [weak childStackView] _ -> Observable<UIStackView> in
@@ -191,10 +188,10 @@ private extension StackBarButtonItem {
191188
.filter {type(of: $0) != UIStackView.self }
192189
.forEach { $0.isHidden = true }
193190
})
194-
191+
195192
addDisposable(disposable)
196193
}
197-
194+
198195
/// Check didAddSubView timing
199196
///
200197
/// - Parameter stackView: superView of childStackView
@@ -208,24 +205,24 @@ private extension StackBarButtonItem {
208205
// MARK: iOS10 or less private method
209206
@available(iOS, introduced: 9.0, obsoleted: 11.0)
210207
private extension StackBarButtonItem {
211-
208+
212209
/// Configure margin width
213210
func configureMinusMargin() {
214211
guard let rootVC = UIApplication.shared.delegate?.window??.rootViewController?.children.first else { return }
215-
212+
216213
// observe viewWillLayoutSubviews(transition)
217214
let disposable = rootVC.rx.methodInvoked(#selector(UIViewController.viewWillLayoutSubviews))
218215
.observeOn(ConcurrentMainScheduler.instance)
219216
.subscribe(onNext: { [weak self] (_) in
220217
guard let me = self else { return }
221-
218+
222219
// configure margin
223220
me.marginItem.width = me.minusMargin(rootVC.traitCollection)
224221
})
225-
222+
226223
addDisposable(disposable)
227224
}
228-
225+
229226
/// Minus margin width in case of iOS 10 or or less
230227
///
231228
/// - Parameter traitCollection: Use for iPhone Orientation
@@ -234,7 +231,7 @@ private extension StackBarButtonItem {
234231
if UIDevice.current.isPad || UIDevice.current.isPlus {
235232
return -20
236233
}
237-
234+
238235
// iPhone
239236
return traitCollection.verticalSizeClass == .regular ? -16: -20
240237
}

StackBarButtonItem/Source/StackViewExtension.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@ extension UIStackView {
77
self.distribution = .fill
88
self.spacing = spacing
99
}
10-
10+
1111
func updateFrameSize() {
1212
let spaceWidth = CGFloat(max(self.arrangedSubviews.count - 1, 0)) * self.spacing
1313
let width = self.arrangedSubviews.reduce(CGFloat(0), { $0 + $1.frame.size.width }) + spaceWidth
1414
let height = self.arrangedSubviews.reduce(CGFloat(0), { max($0, $1.frame.size.height) })
1515
self.frame.size = CGSize(width: width, height: height)
1616
}
17-
17+
1818
func addMarginView(barButtonPosition: StackBarButtonItem.BarButtonPosition, margin: CGFloat = 0) {
1919
if margin > 0 {
2020
let marginView = UIView(frame: CGRect(x: 0, y: 0, width: margin, height: 0))
2121
marginView.widthAnchor.constraint(equalToConstant: margin).isActive = true
22-
22+
2323
switch barButtonPosition {
2424
case .left:
2525
self.insertArrangedSubview(marginView, at: 0)

StackBarButtonItem/Source/UINavigationItem+StackBarButtonItem.swift

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,20 @@ private let _leftAssociatedKey = UnsafeMutablePointer<UInt>.allocate(capacity: 1
55

66
extension UINavigationItem {
77
public var right: StackBarButtonItem {
8-
get {
9-
guard let stackBarButtonItem = objc_getAssociatedObject(self, _rightAssociatedKey) as? StackBarButtonItem else {
10-
let stackBarButtonItem = StackBarButtonItem(navigationItem: self, position: .right)
11-
objc_setAssociatedObject(self, _rightAssociatedKey, stackBarButtonItem, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
12-
return stackBarButtonItem
13-
}
8+
guard let stackBarButtonItem = objc_getAssociatedObject(self, _rightAssociatedKey) as? StackBarButtonItem else {
9+
let stackBarButtonItem = StackBarButtonItem(navigationItem: self, position: .right)
10+
objc_setAssociatedObject(self, _rightAssociatedKey, stackBarButtonItem, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
1411
return stackBarButtonItem
1512
}
13+
return stackBarButtonItem
1614
}
17-
15+
1816
public var left: StackBarButtonItem {
19-
get {
20-
guard let stackBarButtonItem = objc_getAssociatedObject(self, _leftAssociatedKey) as? StackBarButtonItem else {
21-
let stackBarButtonItem = StackBarButtonItem(navigationItem: self, position: .left)
22-
objc_setAssociatedObject(self, _leftAssociatedKey, stackBarButtonItem, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
23-
return stackBarButtonItem
24-
}
17+
guard let stackBarButtonItem = objc_getAssociatedObject(self, _leftAssociatedKey) as? StackBarButtonItem else {
18+
let stackBarButtonItem = StackBarButtonItem(navigationItem: self, position: .left)
19+
objc_setAssociatedObject(self, _leftAssociatedKey, stackBarButtonItem, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
2520
return stackBarButtonItem
2621
}
22+
return stackBarButtonItem
2723
}
2824
}

0 commit comments

Comments
 (0)