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