Есть ли способ настроить панель навигации внутри подкласса UIView? - PullRequest
0 голосов
/ 03 апреля 2020

Как я могу настроить панель навигации внутри моего подкласса UIView, а не внутри ViewController через доступ к свойству navigationBar?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Вот очень простой пример.

  • Пользовательский UIView подкласс
  • При инициализации:
    • добавляет UINavigationBar к себе
    • добавляет кнопку «Добавить», заголовок и кнопку «Готово» на панель
    • устанавливает полосу .tintColor на красный
    • ограничивает полосу к вершине и ширине самой
  • TestingViewController создает и добавляет пользовательский вид

Весь код - без @IBOutlet или @IBAction соединений - поэтому просто назначьте новый контроллер вида для TestingViewController класс:

class MyCustomView: UIView {

    let myNavBar = UINavigationBar()

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    func commonInit() -> Void {
        backgroundColor = .systemTeal
        addSubview(myNavBar)
        myNavBar.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            myNavBar.topAnchor.constraint(equalTo: topAnchor),
            myNavBar.leadingAnchor.constraint(equalTo: leadingAnchor),
            myNavBar.trailingAnchor.constraint(equalTo: trailingAnchor),
        ])
        myNavBar.tintColor = .red

        let navItem = UINavigationItem(title: "MyNavBar")
        let addItem = UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: #selector(addTapped(_:)))
        let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(doneTapped(_:)))
        navItem.leftBarButtonItem = addItem
        navItem.rightBarButtonItem = doneItem
        myNavBar.setItems([navItem], animated: false)

    }

    @objc func addTapped(_ sender: Any?) -> Void {
        print("Add tapped!")
    }
    @objc func doneTapped(_ sender: Any?) -> Void {
        print("Done tapped!")
    }

}

class TestingViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let myView = MyCustomView()
        myView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(myView)
        let g = view.safeAreaLayoutGuide
        NSLayoutConstraint.activate([
            myView.topAnchor.constraint(equalTo: g.topAnchor, constant: 100.0),
            myView.heightAnchor.constraint(equalToConstant: 200.0),
            myView.widthAnchor.constraint(equalToConstant: 280.0),
            myView.centerXAnchor.constraint(equalTo: g.centerXAnchor, constant: 0.0),
        ])

    }
}

Результат:

enter image description here

0 голосов
/ 03 апреля 2020

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

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