|
//
// NavigationBar.swift
// PaiaiUIKit
//
// Created by FFIB on 2019/4/23.
// Copyright © 2019 FFIB. All rights reserved.
//
import UIKit
class NavigationBar: UINavigationBar {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func getNavigationBarBounds() -> CGRect {
let statusHeight = UIApplication.shared.statusBarFrame.height
return CGRect(x: 0, y: -statusHeight, width: bounds.width, height: bounds.height + statusHeight)
}
override func value(forUndefinedKey key: String) -> Any? {
return nil
}
}
public extension UINavigationBar {
func getBarBackground() -> UIView? {
return value(forKeyPath: "_backgroundView") as? UIView
}
func getBarContentView() -> UIView? {
for val in subviews {
if let contentClass = NSClassFromString("_UINavigationBarContentView"),
val.isKind(of: contentClass) {
return val
}
}
return nil
}
func getShadowView() -> UIView? {
guard let barBackground = getBarBackground() else { return nil }
for view in barBackground.subviews where view.bounds.height == 0.5 {
return view
}
return nil
}
internal func apply(for configure: NavigationBarConfiguration) {
isHidden = configure.isHidden
isTranslucent = configure.isTranslucent
barStyle = configure.barStyle
shadowImage = configure.shadowImage
setBackgroundImage(configure.backgroundImage, for: .default)
}
internal convenience init(configure: NavigationBarConfiguration) {
self.init()
apply(for: configure)
}
}
public extension UIToolbar {
func getBarBackground() -> UIView? {
return value(forKeyPath: "_backgroundView") as? UIView
}
func getShadowView() -> UIView? {
guard let barBackground = getBarBackground() else { return nil }
for view in barBackground.subviews where view.bounds.height == 0.5 {
return view
}
return nil
}
internal convenience init(configure: NavigationBarConfiguration) {
self.init()
isHidden = configure.isHidden
isTranslucent = configure.isTranslucent
barStyle = configure.barStyle
setShadowImage(configure.shadowImage, forToolbarPosition: .any)
setBackgroundImage(configure.backgroundImage, forToolbarPosition: .any, barMetrics: .default)
}
}
extension UIViewController {
internal func getFakeBarFrame(for navigationBar: UINavigationBar) -> CGRect? {
guard let backgroundView = navigationBar.getBarBackground(),
var frame = backgroundView.superview?.convert(backgroundView.frame, to: self.view)
else { return nil }
frame.origin.x = self.view.bounds.origin.x
return frame
}
}
|