[Résolu] Storyboard, NSSplitView et Autolayout

olofolof Membre
janvier 2015 modifié dans API AppKit #1

Salut à  tous,


 


j'essaye de faire un Ui pour une application avec un menu sur le côté gauche et un contenu principal sur le reste de l'écran. Je pensais faire ça avec un split view dont la première subview serait de largeur fixe. Mon but serait de fixer la largeur de mon menu avec Autolayout. Mon problème est que je n'arrive pas à  ajouter une contrainte sur ma vue "menu"...


 


On peut voir mon Storyboard sur la copie d'écran jointe. La vue "Menu view" est sélectionnée et j'ouvre le menu "Pin" de Autolayout. Et là , tout est grisé. Je ne peux pas ajouter une contrainte sur la largeur, par exemple.


 


Je pense qu'il y a un truc que je n'ai pas capté, mais je ne vois pas quoi...


 


Une idée ???


 


Merci d'avance !


 


 


PS: Xcode 6.1.1, OS X 10.10.1


 


 


Réponses

  • CéroceCéroce Membre, Modérateur

    C'est normal, parce que les contraintes sont ajoutées à  la vue parente.


     


    Par exemple, si tu veux qu'une vue fasse 50% de la largeur de sa vue parente, la contrainte sera:


    vueEnfant.width = 0,5 x superview.width


    La contrainte sera ajoutée à  superview, pas à  vueEnfant.


  • D'accord, mais si on veut qu'une vue ait une largeur fixe (200 pixels), la contrainte doit aussi être ajoutée à  la vue parente ?


     


    Et dans le cas d'une Split View, est-ce qu'on peut dire que la vue parente est splitViewController.view et que la vue enfant est splitViewController.splitViewItems[0].view ???


  • CéroceCéroce Membre, Modérateur

    Dans le cas d'une split view, c'est la largeur du panneau qu'il faut contraindre. Je ne me rappelle plus des détails, mais je sais que c'est réglables dans le xib, et que c'est inutilisable sous 10.7.


  • Ok avec un xib, j'ai vu passer quelques infos à  ce sujet. Mais dans mon cas, j'utilise un Storyboard ! Et comme les vues des panneaux ne sont pas intégrées à  la split view mais reliées par des Segues, je ne vois pas comment faire...


     


    Si je n'ai pas de réponses d'ici là , je vais mettre un projet basique à  disposition...


  • Voilà , j'ai fait un mini projet pour illustrer mes propos. Il est là  : https://github.com/olofweb/SplitViewAutolayout


     


    J'ai mis une vue à  gauche (MenuView) et j'aimerais que cette vue soit de largeur fixe (64 pixels). Comme je n'arrive pas à  y mettre de contraintes autolayout, j'essaye de fixer cette largeur avec la méthode splitView.setPosition(). Je le fais dans la méthode viewDidLoad du SplitViewController. Aucun effet.


    Par contre, si je l'appelle avec un léger temps de retard, ça marche (voir les commentaires dans la classe SplitViewController).


     


    Avec les méthodes de NSSPlitViewDelegate, j'arrive à  contraindre la largeur de cette vue à  64 pixels (je n'ai pas mis ce code dans mon projet), mais si on redimensionne la fenêtre, la largeur est perdue !


     


    Si une bonne âme a quelques minutes à  me consacrer...


     


    Merci !


  • CéroceCéroce Membre, Modérateur

    Je viens de regarder, et ce que je constate:


    - de nouvelles classes NSSplitViewController et NSSplitViewItem ont été introduites dans Yosemite


    - mais leur documentation n'apparait pas dans le SDK. On trouve celle de NSSplitViewController sur le web, mais pas celle de NSSplitViewItem; il faut aller voir le header.


    - J'ai déjà  eu du mal à  comprendre comment on faisait pour dire quels étaient les view controllers associés aux items dans le Storyboard.


     


    Bref, tout cela est bâclé, en fait, comme tout ce qui concerne Yosemite.


    Je ne comprends pas non plus pourquoi le view controller le gauche est retracté. J'ai essayé d'augmenter la holding priority, sans succès. J'ai changé le type de divider en "thick". Tu verras alors qu'on bien le déployer à  la souris.


     


    Peut-être il y a-t-il des infos à  pêcher dans les vidéos de WWDC, mais à  vrai dire, ça me paraà®t surtout buggé.


  • CéroceCéroce Membre, Modérateur



  • Intéressant, ce lien. Je n'étais étrangement pas tombé dessus...


     


    Il faut lier le NSSplitView au NSSplitViewController view et lier le NSSplitViewController au delegate de la SplitView. Après, ma vue de gauche est visible à  l'ouverture de la fenêtre. Ca avance !


     


    Et en augmentant le "holding priority" du SplitItem de gauche (251 contre 250 pour celui de droit), ça fonctionne ! Yes !


     


    J'ai mis à  jour mon projet sous Github, pour ceux que ça pourrait intéresser.


     


    Merci Céroce !

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