Пользовательская кнопка возврата в навигации в iOS - PullRequest
0 голосов
/ 03 марта 2020

Я знаю, что этот вопрос задавался ранее, но у меня ничего не получалось, и мне пришлось его задавать снова. Я хочу изображение в качестве кнопки «Назад» на панели навигации, просто хочу изменить внешний вид кнопки «Назад». Я не хочу добавлять кнопку и добавлять селекторы для нее.

Я попробовал следующий код:

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)

Я также попытался установить заднее изображение и маску спины, используя раскадровку, но оба эти подходы помещают черный круг на мое заднее изображение.

Я попытался установить другое изображение в качестве маски спины, установив его альфа-содержимое равным нулю с помощью кода, но оно также не сработало.

пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 04 марта 2020

Просто добавьте следующие методы в свой 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
}

Внутри метода ViewDidLoad вашего ViewController установите BackButton As:

    self.navigationController?.isNavigationBarHidden = false
    AppDelegate.shared().setupNavigationBar()
    setLeftBarBackItem()
    setTranspertNavigation()
    self.title = "Title Here"
0 голосов
/ 03 марта 2020
  • Создание пользовательского класса для определения характеристик панели навигации
  • Создание расширения для UINavigationController для его настройки

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
  }
}

И затем вы можете настроить панель навигации в viewWillAppear вашего ViewController (например, 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 viewWillDisappear

  public override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    navigationController?.resetBar()
  }
0 голосов
/ 03 марта 2020
let backButton = UIBarButtonItem()
backButton.title = "Back"
backButton.image = UIImage(named: "Back_button")
self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton

Вы можете сделать это, чтобы настроить кнопку "Назад" . И вам не нужно беспокоиться о добавлении селекторов .

0 голосов
/ 03 марта 2020

Я делаю это с помощью пользовательского 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 в конструкторе интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...