Retrouver/calculer la marge à  droite dans une UINavigationBar

Bonjour à  tous  :D ,

 

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

  • colas_colas_ Membre
    février 2016 modifié #2

    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.



  •  


     


    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



    navigationBar.layoutMargins = UIEdgeInsetsMake(...)
    navigationBar.setNeedsLafoutIfNeeded
  • Je ne suis pas sur d'avoir compris ton idée, à  aucun moment je n'ai accès à  cette fameuse valeur.




    Comment sais-tu du coup que c'est 16pts ?

  •  


    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.



    override func layoutSubviews() {
    super.layoutSubviews()

    let rb = self.topItem?.rightBarButtonItem
    let frame = CGRect(x: self.frame.width-self.frame.height, y: 0, width: self.frame.height, height: self.frame.height)
    rb?.customView?.frame = frame
    }

    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


Connectez-vous ou Inscrivez-vous pour répondre.