Redimensionnement d'une TableView inexplicable...
Bonjour à tous,
Aujourd'hui, soumission d'un petit problème qui me fait perdre de nombreux cheveux...
J'ai joint une petite vidéo pour mieux expliquer le comportement bizarre d'une tableView placée dans une sideBar: https://www.dropbox.com/s/uehi70y0hrmg836/ListView%20Behaviour.mp4?dl=0
Le principe:
-1 fenêtre dans laquelle il y a:
-1 splitView (gauche: sidebar, droite content)
-chacune des 2 splitViews contient une TabView sans onglet qui permet de glisser d'un environnement (sideBar + content) à un autre grâce à un segmentedControl en Toolbar. Il y a trois environnements (la TabView coté sideBar contient 3 views; la TabView coté Content aussi).
Les 3 views côté sidebar sont en fait des instances d'une même view issu d'un xib, pilotée par le même viewController.
Le problème survient lors des redimensionnements, soit en glissant le divider entre les splitViews (ce qui est montrée dans la vidéo), soit en changeant la taille de la fenêtre.
-Dans l'environnement 3 (Topic), une TableView placée dans la sidebar ne se redimensionne pas en conséquences
-Dans l'environnement 2 (Persons), aucun problème, et la TableView se "refixe" même au bon endroit, si besoin (par exemple lorsque le divider a été déplacé en étant dans l'environnement 3
-Dans l'environnement 1 (Transcriptions), aucun problème non plus, par contre, la TableView ne se "reflex" pas: elle se déplace en conséquence en gardant les décalages qu'elle a pu subir dans l'environnement 3.
Je ne sais pas si tout ça est très clair, d'où la vidéo !
Je peux admettre un problème au niveau d'Autolayout, ou même un autre problème qui ne m'aurait pas du tout effleuré. Mais ce qui est particulièrement étrange, c'est que les 3 views côté sidebar devraient adopter le même comportement (quel qu'il soit). Ici, trois comportements différents que je ne m'explique pas.
Je pense avoir tout essayé:
-Recréation du projet dans sa plus simple expression
-Rajout de plus d'environnements (1 puis 2 de plus): tous les environnements supplémentaires adoptent le même comportement que celui de l'environnement 3
-Lors de l'ajout de la sideBar à la splitView, essai en version sideBar ou normal:
splitVC.addSplitViewItem(NSSplitViewItem(sidebarWithViewController: tabPanelVC))
splitVC.addSplitViewItem(NSSplitViewItem(viewController: tabPanelVC))
Je soumets à la communauté en espérant que vous serez plus clairvoyant que moi!
Le projet est à disposition...
Joshua
Réponses
Hello Joshua,
J'ai regardé la vidéo, j'aime beaucoup les transitions verticales. Si j'ai bien compris tu as fait ça avec une TabView ?
Ton problème est très étrange... Surtout du fait que c'est le même VC...
Peux-tu mettre ton projet sur GitHub ? (chose à apprendre si tu ne sais pas le faire)
Sinon, peux-tu le mettre en pièce jointe ?
Colas
Voici le projet
(pour Github, il va falloir mais j'ai la flemme! ;-)
Bon courage et merci !!
JT
En complément:
J'ai migré sur Xcode 8 Beta cette nuit (une envie, comme ça, et je crois que je vais m'en mordre les doigts pour longtemps...).
Après bien des difficultés, j'ai réussi à remouliner le projet en Swift 3.
Cette fois-ci:
-l'environnement 3 fonctionne de la même manière (toujours le bug de non-redimensionnement)
-l'environnement 2 adopte cette fois-ci le même comportement que le 3 (non-redimensionnement)
-l'environnement 1 se comporte comme le 2 de la version en Swift 2.2 (redimensionnement + réajustement si un décalage a été occasionnée par l'environnement 2 ou 3)
JT
Plus simplement, dans IB, on peut forcer dans les contrôles à droite le comportement d'un objet en fonction de sa view supérieure. Ce sont des petites flèches rouges en haut, en bas, à droite et à gauche de l'objet (représenté par un rectangle). Normalement, "ça le fait".
Eh oui... ça le fait!
Un grand merci!
En fait, j'avais un peu évacuée cette approche de ma tête parce qu'en lisant pas mal de forums là -dessus, il est souvent souligné que la propriété autoresizingMask entrait en conflit avec AutoLayout.
J'avais donc pris soin de mettre la propriété en false, puis bidouiller les contraintes AutoLayout à la main. En même temps, ça m'a permis d'approfondir un peu le debugger de Xcode (un puits sans fond ce truc: si quelqu'un connait des bonnes ressources un peu didactiques pour savoir comment - et souvent quoi - chercher, je suis preneur !!)
Toujours est-il que:
1- En effet, ça marche juste en cliquant sur les petites flèches rouges (or elles n'étaient pas mises comme il faut)
2-Apparemment, ce "mauvais réglage" de ma part laissait la main libre à AutoLayout pour interpréter les contraintes manquantes selon les autres views de la fenêtre. Résultat, les contraintes rajoutées pour l'un des TabViewItems ne l'étaient pas forcément pour les autres...
3-Ce qui reste étrange, c'est que même en rajoutant les contraintes en code, elles semblaient être éjectées en runtime (en tout cas, elles disparaissaient de l'array ViewController.constraints...
Mais là , j'ai besoin d'une pause sur AutoLayout, je m'y replongerai plus tard!
Un grand merci à ceux qui se sont creusé la tête et à Hervé pour la solution!
J
Ben franchement, de rien! Je suis content que ça marche.
Apple, c'est souvent comme ça : c'est simple, mais il faut connaà®tre... ???