Réglez la position de l'élément de bouton de barre lors de l'utilisation de grands titres avec ios 11

j'utilise le grand titre navbar avec ios 11, mais quand j'ajoute un élément de bouton de barre il semble bizarre placé dans le même endroit que le titre original navbar. Je voudrais déplacer le bouton de la barre de l'article vers le bas quand le titre est grand, et le déplacer de nouveau dans sa position originale quand le navbar n'est plus grand. Quelle serait la meilleure façon de le faire?

c'est une image montrant la position bizarre du bouton de la barre l'élément

largeTitleNavbar

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

override func viewWillLayoutSubviews() {
    guard let navbarHeight = self.navigationController?.navigationBar.frame.height else{ return }
}
14
demandé sur Ali 2017-07-26 08:13:39

3 réponses

pour résoudre mon propre problème, j'ai juste ajouté un bouton comme sous-vue de la barre de navigation et réglé les contraintes de droite et de bas à la barre de navigation. Le bouton va maintenant se déplacer 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 affichez segue à partir de ce contrôleur de vue. Ainsi, j'ai ajouté une balise de 1 au bouton et je l'ai retirée de sa superview de l'autre contrôleur de vue. C'est la meilleure façon de le résoudre, et j'ai trouvé le plus facile méthode.

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 supprimer à partir de n'importe quel spectacle s'est alors tourné vue contrôleurs:

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

3
répondu Ali 2017-08-04 04:10:29

ce que vous voulez faire est de définir les réglages de position du titre de BarButtonItem. Ajoutez la ligne suivante à l' viewWillAppear func. Jouer avec le vertical et horizontal valeur 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

2
répondu ap147 2017-08-05 00:33:26

la bonne façon est que vous pouvez ajuster le titre de navigation si sa grande de sorte que votre barre bouton pour ajuster automatiquement. Voici le code. Aussi iOS mail l'application fait 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 voulez ajuster le bouton sous le titre si il se développe alors 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
répondu Hussain Shabbir 2017-07-29 21:16:54