我知道之前曾有人问过这个问题,但对我没有任何帮助,我不得不再问一次。 我想要一个图像作为导航栏中的后退按钮,只想更改后退按钮的外观。我不想添加按钮并为其添加选择器。
我尝试了以下代码:
let backImage = UIImage(named: "Back_button")
let backAppearance = UIBarButtonItem.appearance()
backAppearance.setBackButtonBackgroundImage(backImage, for: .normal, barMetrics: .default)
navigationController?.navigationBar.backIndicatorTransitionMaskImage = backImage
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItem.Style.plain, target: nil, action: nil)
我还尝试使用情节提要设置背面图像和背面蒙版,但是这两种方法都在背面图像上放置了一个黑色圆圈。
我尝试通过使用代码将另一张图片的Alpha值设置为零来设置另一张图片作为后掩膜,但是它也不起作用。
请帮助。
答案 0 :(得分:0)
我使用自定义UINavigationController进行此操作:
import Foundation
import UIKit
class NavigationViewController : UINavigationController
{
override func viewDidLoad()
{
super.viewDidLoad()
self.navigationBar.backIndicatorImage = UIImage(named: "Back_button")
self.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "Back_button")
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
只需在界面构建器中更改UINavigationController的类。
答案 1 :(得分:0)
let backButton = UIBarButtonItem()
backButton.title = "Back"
backButton.image = UIImage(named: "Back_button")
self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
您可以执行此操作以自定义后退按钮。而且,您不必担心添加选择器。
答案 2 :(得分:0)
只需在ViewController中添加以下方法:
func setLeftBarBackItem() {
var leftBarBackItem = UIBarButtonItem()
leftBarBackItem = UIBarButtonItem(image: #imageLiteral(resourceName: "imgBack"), style: .plain, target: self, action: #selector(self.clickToBtnBackItem(_:)))
self.navigationItem.leftBarButtonItem = leftBarBackItem
}
func clickToBtnBackItem(_ sender: UIBarButtonItem) {
view.endEditing(true)
_ = navigationController?.popViewController(animated: true)
}
func setTranspertNavigation()
{
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = .clear
}
在ViewController的ViewDidLoad方法内部,将backButton设置为:
self.navigationController?.isNavigationBarHidden = false
AppDelegate.shared().setupNavigationBar()
setLeftBarBackItem()
setTranspertNavigation()
self.title = "Title Here"
答案 3 :(得分:-1)
import UIKit
private final class MyNavigationBarTraits {
public var backIndicatorImage: UIImage?
public var backIndicatorTransitionMaskImage: UIImage?
public func apply(to navigationBar: UINavigationBar) {
navigationBar.backIndicatorImage = backIndicatorImage
navigationBar.backIndicatorTransitionMaskImage = backIndicatorTransitionMaskImage
}
public init(navigationBar: UINavigationBar) {
backIndicatorImage = navigationBar.backIndicatorImage
backIndicatorTransitionMaskImage = navigationBar.backIndicatorTransitionMaskImage
}
}
public typealias Callback<T> = (_: T) -> Void
public extension UINavigationController {
private struct AssociationKeys {
static var navigationBarTraits = "ws_nc_navigationBarTraits"
}
private var navigationBarTraits: MyNavigationBarTraits? {
get {
return objc_getAssociatedObject(self, &AssociationKeys.navigationBarTraits) as? MyNavigationBarTraits
}
set {
objc_setAssociatedObject(self, &AssociationKeys.navigationBarTraits, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
func configureBar(block: Callback<UINavigationBar>) {
navigationBarTraits = MyNavigationBarTraits(navigationBar: navigationBar)
block(navigationBar)
}
func resetBar() {
navigationBarTraits?.apply(to: navigationBar)
navigationBarTraits = .none
}
}
然后您可以在ViewController的viewWillAppear
(例如tintColor
)中配置导航栏
public override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.configureBar { navigationBar in
// You can customize your navigation bar in here!
navigationBar.tintColor = .red
}
}
如果只想在一个View Controller中使用此自定义设置,则应重置View Controller的viewWillDisappear
public override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.resetBar()
}