
一、设置backBarButtonItem
按钮
self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "BackArrow_Nav")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "BackArrow_Nav")
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
二、设置导航栏渐变色
import UIKit
import IQKeyboardManagerSwift
internal class BaseController: UIViewController {
var returnKeyHandler: IQKeyboardReturnKeyHandler!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
MobClick.beginLogPageView(NSStringFromClass(type(of: self).self))
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
MobClick.endLogPageView(NSStringFromClass(type(of: self).self))
self.returnKeyHandler = nil
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
extension BaseController {
override func viewDidLoad() {
super.viewDidLoad()
// 隐藏黑线设置无蒙版效果
self.navigationController?.hidesNavigationBarHairline = true
self.navigationController?.navigationBar.isTranslucent = false
//
self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
self.navigationController?.navigationBar.tintColor = UIColor.white
// self.navigationController?.navigationBar.barTintColor = UIColor(hexString: "#1663be")
self.view.backgroundColor = UIColor.white
self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "BackArrow_Nav")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "BackArrow_Nav")
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
navigationController?.navigationBar.apply(gradient: [UIColor(hexString: "#3496F4"), UIColor(hexString: "#75B4FF")])
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont.adjustFontSize(ofSize: 15)], for: .normal)
self.navigationItem.rightBarButtonItem?.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont.adjustFontSize(ofSize: 15)], for: .normal)
self.navigationItem.backBarButtonItem?.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont.adjustFontSize(ofSize: 15)], for: .normal)
}
}
extension UINavigationBar {
/// Applies a background gradient with the given colors
func apply(gradient colors : [UIColor]) {
var frameAndStatusBar: CGRect = self.bounds
frameAndStatusBar.size.height += 20 // add 20 to account for the status bar
setBackgroundImage(UINavigationBar.gradient(size: frameAndStatusBar.size, colors: colors), for: .default)
}
/// Creates a gradient image with the given settings
static func gradient(size : CGSize, colors : [UIColor]) -> UIImage? {
// Turn the colors into CGColors
let cgcolors = colors.map { $0.cgColor }
// Begin the graphics context
UIGraphicsBeginImageContextWithOptions(size, true, 0.0)
// If no context was retrieved, then it failed
guard let context = UIGraphicsGetCurrentContext() else { return nil }
// From now on, the context gets ended if any return happens
defer { UIGraphicsEndImageContext() }
// Create the Coregraphics gradient
var locations : [CGFloat] = [0.0, 1.0]
guard let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: cgcolors as NSArray as CFArray, locations: &locations) else { return nil }
// Draw the gradient
context.drawLinearGradient(gradient, start: CGPoint(x: 0.0, y: 0.0), end: CGPoint(x: size.width, y: 0.0), options: [])
// Generate the image (the defer takes care of closing the context)
return UIGraphicsGetImageFromCurrentImageContext()
}
}
import Foundation
@objc protocol BackButtonHandlerProtocol {
@objc optional func navigationShouldPopOnBackButton() -> Bool
}
extension UIViewController: BackButtonHandlerProtocol {}
extension UINavigationController: UINavigationBarDelegate {
public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
if viewControllers.count < (navigationBar.items?.count ?? 0) {
return true
}
let shouldPop = (topViewController as! BackButtonHandlerProtocol).navigationShouldPopOnBackButton?() ?? true
if shouldPop {
DispatchQueue.main.async(execute: {
self.popViewController(animated: true)
})
} else {
for subView in navigationBar.subviews {
if subView.alpha < 1 {
UIView.animate(withDuration: 0.25, animations: {
subView.alpha = 1
})
}
}
}
return false
}
}
网友评论