Transition NSTabView casse l'autolayout
J'ai remarqué quelque chose d'assez chiant: les animations de transition des NSTabView cassent les contraintes autolayout.
Voilà le setup :
- Un storyboard.
- Un NSTableViewController.
- Une NSTabView managée par le controleur.
- Dans chaque TabItem il y a une view qui est contrainte en taille et qui colle au bord du TabItem (0 aux 4 bords et width et height sont contraints en somme)
- Il n'est pas possible de redimensionner la fenêtre.
Sans aucune transition ou à la rigueur crossfade il n'y a aucun problème lors d'un passage d'une vue à l'autre.
Si maintenant j'utilise la transition slide des messages vont apparaà®tre dans la console en me disant que l'autolayout est tout cassé parce qu'il ne peut pas concilier toutes les contraintes ça donne un truc de ce genre:
Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0x618000084740 H:[NSView:0x6180001203c0(450)]>",
"<NSLayoutConstraint:0x6180000849c0 H:[NSView:0x6180001203c0]-(0)-| (Names: '|':NSView:0x618000120320 )>",
"<NSLayoutConstraint:0x618000084a60 H:|-(0)-[NSView:0x6180001203c0] (Names: '|':NSView:0x618000120320 )>",
"<NSAutoresizingMaskLayoutConstraint:0x618000085be0 h=-&- v=-&- H:|-(-450)-[NSView:0x618000120320] (Names: '|':NSTabView:0x100b09630 )>",
"<NSAutoresizingMaskLayoutConstraint:0x618000085c80 h=-&- v=-&- H:[NSView:0x618000120320]-(0)-| (Names: '|':NSTabView:0x100b09630 )>",
"<NSLayoutConstraint:0x6180000839d0 H:[NSView:0x618000120460(450)]>",
"<NSLayoutConstraint:0x618000084150 H:|-(0)-[NSView:0x618000120460] (Names: '|':NSView:0x618000120500 )>",
"<NSLayoutConstraint:0x618000084330 H:[NSView:0x618000120460]-(0)-| (Names: '|':NSView:0x618000120500 )>",
"<NSAutoresizingMaskLayoutConstraint:0x608000085690 h=-&- v=-&- H:|-(0)-[NSView:0x618000120500] (Names: '|':NSTabView:0x100b09630 )>",
"<NSAutoresizingMaskLayoutConstraint:0x608000085cd0 h=-&- v=-&- H:[NSView:0x618000120500]-(0)-| (Names: '|':NSTabView:0x100b09630 )>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x6180000839d0 H:[NSView:0x618000120460(450)]>
Au final ça ne porte pas réellement à conséquence mais ça fait vraiment pas propre de livrer un bouzin pareil...
Quelqu'un a une idée ? Je pense que ça a à voir avec la manière dont est géré la transition parce que la vue incriminée n'existe pas. Enfin si mais c'est une sorte de vue temporaire créée pour l'occasion (j'ai déjà investigué dans mon coin) et très certainement dédiée uniquement à l'animation...
ça sent le radar (et par radar j'entends laisser tomber)...
Réponses
Je me rappelle avoir codé un navigation controller qui fonctionnait parfaitement, jusqu'à ce que je mette une NSTableView dans le view controller: elle restait figée sur place alors que le reste s'animait bien.
J'ai constaté à maintes reprises que l'intégration de Core Animation sur l'AppKit était assez boguée, et comme les bugs ne sont jamais corrigés...
Reste que je n'ai pas tout compris: tu utilises les transitions du storyboard, c'est ça ?
Non les transitions de NSTabView. Qui en réalité reposent les mécanismes de présentation des viewControllers, que les storyboards utilisent aussi d'ailleurs.
Plus exactement tu peux l'activer comme ça dans une sous-classe de NSTabViewController :
Et c'est la seule manière de le faire, IB te propose des options en te promettant d'activer les transitions mais il ment :