web-dev-qa-db-fra.com

Personnalisez la barre de navigation en ajoutant deux étiquettes au lieu du titre dans Swift

J'essaie d'ajouter deux étiquettes à l'endroit où le titre est affiché dans la barre de navigation, mais j'ai du mal à le faire. Ce serait très bien si je pouvais y arriver avec le storyboard mais comme je peux le voir, je ne peux pas le faire.

Comme je l'ai vu, j'ai besoin d'utiliser navigationItem mais je ne sais pas exactement comment faire cela. Si quelqu'un avait un exemple ou si quelqu'un pouvait m'expliquer plus précisément comment le faire, ce serait merveilleux.

Et je dois mentionner que je ne connais pas du tout Obj-C, donc toute aide devrait être dans Swift.

14
Ilir V. Gruda

Je ne sais pas si vous pouvez le faire à partir du storyboard, mais si vous souhaitez ajouter deux étiquettes de titre, vous pouvez effectuer les opérations suivantes dans la méthode viewDidLoad() du contrôleur de vue pour lequel vous souhaitez les deux titres:

if let navigationBar = self.navigationController?.navigationBar {
    let firstFrame = CGRect(x: 0, y: 0, width: navigationBar.frame.width/2, height: navigationBar.frame.height)
    let secondFrame = CGRect(x: navigationBar.frame.width/2, y: 0, width: navigationBar.frame.width/2, height: navigationBar.frame.height)

    let firstLabel = UILabel(frame: firstFrame)
    firstLabel.text = "First"

    let secondLabel = UILabel(frame: secondFrame)
    secondLabel.text = "Second"

    navigationBar.addSubview(firstLabel)
    navigationBar.addSubview(secondLabel)
}

De cette façon, vous pouvez ajouter autant de sous-vues que vous le souhaitez à la barre de navigation

27
vdawg

Voici une implémentation qui utilise une vue de pile à la place, ce qui vous donne également une certaine polyvalence avec la disposition des étiquettes:

class ViewController: UIViewController {

    lazy var titleStackView: UIStackView = {
        let titleLabel = UILabel()
        titleLabel.textAlignment = .center
        titleLabel.text = "Title"
        let subtitleLabel = UILabel()
        subtitleLabel.textAlignment = .center
        subtitleLabel.text = "Subtitle"
        let stackView = UIStackView(arrangedSubviews: [titleLabel, subtitleLabel])
        stackView.axis = .vertical
        return stackView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.titleView = titleStackView
    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        if view.traitCollection.horizontalSizeClass == .compact {
            titleStackView.axis = .vertical
            titleStackView.spacing = UIStackView.spacingUseDefault
        } else {
            titleStackView.axis = .horizontal
            titleStackView.spacing = 20.0
        }
    }
}

Demonstrates using a stack view to create a custom navigation item's title view

10
Scott Gardner