web-dev-qa-db-fra.com

Ajuster la position de l'élément de bouton de barre lors de l'utilisation de grands titres avec iOS 11

J'utilise la grande barre de navigation du titre avec iOS 11, mais lorsque j'ajoute un élément de bouton de barre, il semble bizarre positionné au même endroit que la barre de navigation du titre d'origine. Je voudrais déplacer l'élément du bouton de la barre vers le bas lorsque le titre est grand et le remettre dans sa position d'origine lorsque la barre de navigation n'est plus grande. Quelle serait la meilleure façon de procéder?

Ceci est une image montrant la position étrange de l'élément de bouton de barre

largeTitleNavbar

Je peux obtenir la hauteur de la barre de navigation dynamiquement en utilisant viewWillLayoutSubviews (), mais je ne peux pas changer la position de l'élément de bouton de barre en utilisant setTitlePositionAdjustment

override func viewWillLayoutSubviews() {
    guard let navbarHeight = self.navigationController?.navigationBar.frame.height else{ return }
}
17
Ali

Pour résoudre mon propre problème, je viens d'ajouter un bouton en tant que sous-vue de la barre de navigation et de définir les contraintes droite et inférieure sur la barre de navigation. Le bouton se déplace maintenant de haut en bas lorsque la barre de navigation change de taille. Cependant, cela nécessite que le bouton soit supprimé dans tous les contrôleurs de vue que vous montrez segue de ce contrôleur de vue. Ainsi, j'ai ajouté une balise de 1 au bouton et l'ai retiré de sa vue d'ensemble de l'autre contrôleur de vue. C'est le moyen le plus simple de le résoudre, et je l'ai trouvé la méthode la plus simple.

Pour configurer le bouton droit:

func setupNavBar() {

    self.title = "Home"
    self.navigationController?.navigationBar.prefersLargeTitles = true
    self.navigationController?.navigationBar.isTranslucent = false

    let searchController = UISearchController(searchResultsController: nil)
    self.navigationItem.searchController = searchController

    let rightButton = UIButton()
    rightButton.setTitle("Right Button", for: .normal)
    rightButton.setTitleColor(.purple, for: .normal)
    rightButton.addTarget(self, action: #selector(rightButtonTapped(_:)), for: .touchUpInside)
    navigationController?.navigationBar.addSubview(rightButton)
    rightButton.tag = 1
    rightButton.frame = CGRect(x: self.view.frame.width, y: 0, width: 120, height: 20)

    let targetView = self.navigationController?.navigationBar

    let trailingContraint = NSLayoutConstraint(item: rightButton, attribute:
        .trailingMargin, relatedBy: .equal, toItem: targetView,
                         attribute: .trailingMargin, multiplier: 1.0, constant: -16)
    let bottomConstraint = NSLayoutConstraint(item: rightButton, attribute: .bottom, relatedBy: .equal,
                                    toItem: targetView, attribute: .bottom, multiplier: 1.0, constant: -6)
    rightButton.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([trailingContraint, bottomConstraint])

}

Pour le supprimer de tout contrôleur de vue show segued:

func removeRightButton(){
    guard let subviews = self.navigationController?.navigationBar.subviews else{return}
    for view in subviews{
        if view.tag != 0{
            view.removeFromSuperview()
        }
    }
} 

Les deux fonctions sont appelées dans la fonction viewWillAppear

6
Ali

Ce que vous voulez faire, c'est définir les ajustements de position du titre de BarButtonItem. Ajoutez la ligne suivante à la fonction viewWillAppear. Jouez avec les valeurs vertical et horizontal pour obtenir le layout de votre goût.

navigationItem.rightBarButtonItem?.setTitlePositionAdjustment(.init(horizontal: 10, vertical: 20), for: UIBarMetrics.default)

https://developer.Apple.com/documentation/uikit/uibarbuttonitem/1617149-settitlepositionadjustment

3
ap147

La bonne façon est que vous pouvez ajuster le titre de navigation s'il est grand afin que votre bouton de barre s'ajuste automatiquement. Voici le code. L'application de messagerie iOS fait également la même chose pour votre référence.

func adjustsTitle() {
 guard let font = UIFont(name: "Helvetica-Medium", size: 16) else { return }
 let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
 label.textColor = UIColor.black
 label.textAlignment = .center
 label.text = navigationItem.title
 label.adjustsFontSizeToFitWidth = true
 navigationItem.titleView = label
}

Réponse mise à jour Si vous souhaitez régler le bouton sous le titre s'il augmente, dans ce cas, vous devez charger la vue personnalisée sur votre barre de navigation.

//Hide back button. Since you are going to have custom button
navigationItem.hidesBackButton = true
//Increase the height based on your view intrinsic content size
navigationController?.navigationBar.frame.size.height = 100
guard let yourCustomView = UINib(nibName: "yourCustomXib", bundle: nil).instantiate(withOwner: nil, options: nil).first as? YourCustomView else {
 fatalError("Missing yourCustomXib")
}
navigationController?.navigationBar.addSubview(yourCustomView)
1
Hussain Shabbir