Retrouver/calculer la marge à droite dans une UINavigationBar
Bonjour à tous ,
Je rencontre un souci pour positionner dynamiquement dans une UINavigationBar un UIBarButtonItem construit avec une custom UIView.
Je veux que mon right bar button soit toujours collé au bord droit de ma navigation bar.
Il existe nativement un padding, une marge, à droite et gauche pour le contenu de la navigation bar.
Pour contrer cela il est possible d'ajouter un UIBarButtonItem de type FixedSpace avec une width négative
let barItem = UIBarButtonItem(customView: view)
let negativeSpace = UIBarButtonItem(barButtonSystemItem: .FixedSpace, target: nil, action: nil)
negativeSpace.width = -16 // ici la width négative
self.navigationItem.rightBarButtonItems = [negativeSpace,barItem]
Ok cela fonctionne bien mais ce qui me chiffonne c'est cette width entrée en dure.
En effet, selon les devices et les size classes, cette marge varie et il faut donc ajuster la valeur de cette width.
De plus, d'une version d'iOS à une autre, la marge peut encore varier.
Cela fait trop d'inconnu et j'aimerais donc savoir comment calculer ou retrouver la valeur de cette marge dynamiquement ?
J'ai regardé les UIEdgeInset de ma navigationbar, bouton et custom view mais ils ne semblent pas refleter la valeur de la marge.
D'apres mes tests sur iOS 9/8 iPad/iPhone Portrait/Paysage, la valeur de la marge varie entre 16 et 20
Dans ce post , xyloweb parle d'ajouter des contraintes mais dans mon cas cela reviendrait à ajouter une contrainte entre le UIBarButtonItem (qui n'est pas une UIView) et la UINavigationBar. je ne crois pas que ce soit la solution
Merci à tous ::) et faites moi savoir si vous avez des idées
Réponses
Une idée : tu calcules cette largeur sur le device en plaçant un UIBarButtonItem juste fait pour connaà®tre cette valeur. Une fois cette valeur connue, tu l'utilises pour tes vrais boutons.
Je ne suis pas sur d'avoir compris ton idée, à aucun moment je n'ai accès à cette fameuse valeur. Même apres avoir ajouté mon bouton.
En fait je cherche à connaitre les marges par défaut sur une navigation bar, ca doit bien etre stocké dansune prorpiété quelque part
Je regarde en ce moment du coté de la propriété layoutMarginsGuide de la navigation bar, elle contient une autre propriété layoutFrame. cette layoutFrame, comparée à la frame de la navigation bar donne des résultats intéressants
voici les logs obtenus
sur iPhone 6, portait :
layoutFrame : (8.0, 8.0, 359.0, 28.0)
navigationBar.frame : (0.0, 0.0, 375.0, 44.0)
-> difference de width de 16px (j'ai cru avoir trouvé ??? )
sur iPhone 6, paysage :
layoutFrame : (8.0, 8.0, 651.0, 16.0)
navigationBar.frame : (0.0, 20.0, 667.0, 32.0)
-> toujours une difference de width de 16px (je m'attendais à 20px en paysage.... )
Essaies de changer les layoutMargins de la navigationBar
Comment sais-tu du coup que c'est 16pts ?
C'est parce que j'ai essayé plusieurs valeurs
16 points en portrait et jusqu'a 20 en paysage selon la size class.
Je n'ai pas de problème pour appliquer ces différentes valeurs
Mon vrai souci est de retrouver ces valeurs dynamiquement via un calcul ou une propriété.
je ne veux pas les rentrer en dur dans le code.
Bon j'ai trouvé une solution finalement .
J'ai sous-classé la navigationBar et surchargé la méthode layoutSubviews.
De cette façon j'ai une view toujours carré, de la hauteur de la navigationBar, et collé au bord droit.
J'espere qu'il n'y aura pas d'effet de bord quand j'integrerai ça à mon projet
Merci à vous