GKNavigationBarSwift.swift
4.0 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//
// GKNavigationBarSwift.swift
// GKNavigationBarSwift
//
// Created by QuintGao on 2020/3/25.
// Copyright © 2020 QuintGao. All rights reserved.
// Custom navigation bar
import UIKit
open class GKNavigationBar: UINavigationBar {
/// 当前所在的控制器是否隐藏状态栏
public var gk_statusBarHidden: Bool = false
/// 导航栏透明度
public var gk_navBarBackgroundAlpha: CGFloat = 1 {
willSet {
for obj in self.subviews {
if let cls = NSClassFromString("_UIBarBackground") {
if #available(iOS 10.0, *), obj.isKind(of: cls) {
DispatchQueue.main.async {
if obj.alpha != newValue {
obj.alpha = newValue
}
}
}else {
if let navBarBackgroundCls = NSClassFromString("_UINavigationBarBackground") {
if obj.isKind(of: navBarBackgroundCls) {
DispatchQueue.main.async {
if obj.alpha != newValue {
obj.alpha = newValue
}
}
}
}
}
}
}
let isClipsToBounds = (newValue == 0.0)
if self.clipsToBounds != isClipsToBounds {
self.clipsToBounds = isClipsToBounds
}
}
}
/// 导航栏分割线是否隐藏
public var gk_navLineHidden: Bool = false
/// 是否是非全屏控制器
public var gk_nonFullScreen: Bool = false
public override init(frame: CGRect) {
super.init(frame:frame)
self.gk_navBarBackgroundAlpha = 1.0
}
required public init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
open override func layoutSubviews() {
super.layoutSubviews()
/// 适配iOS11及以上,遍历所有子控件,向下移动状态栏高度
if #available(iOS 11.0, *) {
for obj in self.subviews {
if let cls = NSClassFromString("_UIBarBackground") {
if obj.isKind(of: cls) {
var frame = obj.frame
frame.size.height = self.frame.size.height
obj.frame = frame
}else {
let navBarHNFS = GKDevice.navBarHeightNonFullScreen()
let navBarH = GKDevice.navBarHeight()
var frame = obj.frame
frame.origin.y = self.frame.size.height - (self.gk_nonFullScreen ? navBarHNFS : navBarH)
obj.frame = frame
}
}
}
}
// 重新设置透明度
let alpha = self.gk_navBarBackgroundAlpha
self.gk_navBarBackgroundAlpha = alpha
// 分割线处理
self.gk_navLineHideOrShow()
}
fileprivate func gk_navLineHideOrShow() {
guard let backgroundView = self.subviews.first else { return }
for view in backgroundView.subviews {
if view.frame.size.height > 0 && view.frame.size.height <= 1.0 {
view.isHidden = self.gk_navLineHidden
}
}
}
}
// 实现touches方法,防止其实现父试图的touches方法
extension GKNavigationBar {
open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}
open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
}
open override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
}
open override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
}
}