NSSplitView et de mise en page automatique
Comment dois-je utiliser la mise en page automatique des contraintes à l'intérieur de NSSplitView
sous-vue?
Mon NSSplitView
sous-vue a 3 sous-vue: topPane
, tableContainer
et bottomPane
et j'ai mis la limite comme ceci:
NSDictionary* views = NSDictionaryOfVariableBindings(topPane, tableContainer, bottomPane);
for (NSView* view in [views allValues]) {
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
}
[myView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topPane(34)][tableContainer][bottomPane(24)]|"
options:0
metrics:nil
views:views]];
[mySplitView addSubview:myView];
Et a obtenu ce dans la console:
Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0x7fd6c4b1f770 V:[NSScrollView:0x7fd6c4b234c0]-(0)-[CPane:0x7fd6c4b2fd10]>",
"<NSLayoutConstraint:0x7fd6c4b30910 V:[CPane:0x7fd6c4b2f870(34)]>",
"<NSLayoutConstraint:0x7fd6c4b30770 V:|-(0)-[CPane:0x7fd6c4b2f870] (Names: '|':NSView:0x7fd6c4b22e50 )>",
"<NSLayoutConstraint:0x7fd6c4b212f0 V:[CPane:0x7fd6c4b2fd10]-(0)-| (Names: '|':NSView:0x7fd6c4b22e50 )>",
"<NSLayoutConstraint:0x7fd6c4b2f910 V:[CPane:0x7fd6c4b2f870]-(0)-[NSScrollView:0x7fd6c4b234c0]>",
"<NSLayoutConstraint:0x7fd6c4b21290 V:[CPane:0x7fd6c4b2fd10(24)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fd6c3630430 h=--& v=--& V:[NSView:0x7fd6c4b22e50(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fd6c4b1f770 V:[NSScrollView:0x7fd6c4b234c0]-(0)-[CPane:0x7fd6c4b2fd10]>
Je pense que <NSAutoresizingMaskLayoutConstraint:0x7fd6c3630430 h=--& v=--& V:[NSView:0x7fd6c4b22e50(0)]>
provoque cela, mais je ne peux pas réinitialiser d'un redimensionnement automatique de masque, parce que NSSplitView
il définit.
Ce qui est le meilleur moyen d'utiliser la mise en page automatique à l'intérieur de la vue fractionnée? Et est-il un moyen de gérer les min/max de la taille de la vue fractionnée sous-vue avec mise en page automatique sans NSSplitViewDelegate
?
- Même problème ici. J'ai posé le tout sur IB plutôt que de la programmation, mais ont les mêmes sortie de débogage, y compris la
NSAutoresizingMaskLayoutConstraint
. - Cela semble fixé en vertu de 10,8 mais est cassé comme vous le notez, sous 10.7. Dans 10,8 vous pouvez définir les hauteurs minimales & de la largeur de l'affichage du contenu de la vue fractionnée dans Xcode (4.5.2 de toute façon). Ne peut pas le faire sous 10.7 et des apps avec ce créé en de 10,8 ne fonctionnent toujours pas droit à 10.7
- Fonctionne en général avec 10,8+ mais les contraintes doivent être spécifiés entre les sous-vues pour la plupart des points de vue - pas supre - ou vous aurez l'Impossibilité de satisfaire simultanément erreur..
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé que cette erreur apparaît si j'ai barre d'outils dans ma fenêtre et de contrôle de la vue partagée par tout ce délégué méthodes:
Solution a été trouvée dans la fixation de la barre d'outils de la fenêtre dans windowDidLoad.
Visible at Launch
case de la barre d'outils, puis de la rendre visible danswindowDidLoad
ne se débarrasser de la bête avertissements. Merci pour l'astuce.NSSplitViewDelegate
méthodes ne joue pas bien avec mise en page automatique et ne doit pas être utilisé. Au lieu de cela, définir des contraintes sur lesNSView
s directement sous laNSSplitView
, et elle devrait fonctionner sans enregistrement.NSSplitView a été une chose étrange depuis le début et il ne me surprendrait pas si ça va bientôt parti. Après avoir essayé d'obtenir NSSplitView de travail avec mise en page automatique depuis un mois maintenant et le naufrage d'un désespoir attaque à un autre, j'ai finalement renoncé à.
Ma solution est de pas utiliser NSSplitView avec mise en page automatique à tous. Donc, soit NSSplitView sans mise en page automatique ou mise en page automatique sans NSSplitView: ce n'est pas très compliqué: il suffit de présenter votre sous-vues uns à côté des autres et ajouter
NSLayoutConstraints
commeIBOutlets
. L'une des constantes de ces contraintes peuvent alors être définies et modifiées à partir du contrôleur dans le code. Avec cette approche, vous pouvez définir l'origine (décalage négatif de glisser hors de la fenêtre), la largeur et les relations avec d'autres sous-vues - plus il est vraiment facile à animer des contraintes avec le point de vue de l'animateur (jamais essayé de animer un NSSplitView?)La seule chose qui manque est la souris, faites glisser sur les diviseurs, mais cela peut être mis en œuvre avec un couple de lignes, suivi mouseEvents dans votre personnalisé "écran à double affichage splitview".
Il y a une mise en forme automatique "écran à double affichage splitview" exemple d'Apple (malheureusement uniquement à la verticale) et je l'ai vu au moins un nouveau projet sur github ces derniers temps. Si pour moi, je pensais que ça serait plus facile de recommencer avec ma solution personnalisée pour mon application à des besoins spécifiques, plutôt que d'essayer de créer quelque chose de très universel (et donc de faire trop complexe à gérer).
Edit: j'ai maintenant terminé mon custom écran à double affichage splitview qui charge ses sous-vues de séparer les pointes. Pas de problèmes de contraintes, pas de mise en page automatique des avertissements. Par rapport à l'ensemble du mois d'essayer de le faire fonctionner avec NSSplitView, j'ai maintenant un travail personnalisé écran à double affichage splitview basée sur les contraintes, facilement animables, créé en une seule soirée. Je vous recommande vraiment de prendre cette voie!
10.8 résolu le problème, voir les notes de version.
Voici ma solution pour 10.7 (une coutume split view):
https://github.com/benuri/HASplitView.git
Pour quelqu'un qui trébuche sur ce sujet dans l'avenir et est à la recherche d'un saut-lancer dans la base de contraintes
NSSplitView
remplacements, j'ai écrit un petit projet qui tente de recréer une partie deNSSplitView
's fonctionnalités en utilisant la Mise en page Automatique:https://github.com/jwilling/JWSplitView
Il est un peu buggé, mais il peut être une référence utile pour tous ceux qui veulent aller dans cette voie.
Vous ne souhaitez pas désactiver
translatesAutoresizingMaskIntoConstraints
à tous. Vous ne devriez pas jouer avec les vues du système de contraintes.NSSplitView
poignées de dimensionnement pour les différents points de vue lui-même et vous êtes essentiellement en essayant de le ripper de les contrôler à distance. Pour ne pas mentionner, vous avez oublié de compte dans le séparateur.La bonne façon de définir un minimum ou un maximum (ou de la constante pour que ce soit), largeur/hauteur, sur un écran à double affichage splitview est de mettre les choses sur le point de vue individuel. En particulier, si vous le faites dans le code, vous devez utiliser 2 appels distincts à constraintsWithVisualFormat, parce que sinon, le format visuel de la langue va créer des contraintes entre les points de vue.
Vous pouvez faire tout cela dans l'IB l'amende juste. Vous pouvez même définir la priorité de chaque affichage dans la vue fractionnée, ce qui va provoquer l'un ou l'autre point de vue, pour redimensionner lorsque la fenêtre de fait, plutôt que de distribuer de l'image également.
Autant que je déteste le fait d'être en désaccord, mais Auco la réponse devrait pas être voté au plus haut. Il n'est en aucune façon utile à la résolution du problème avec une quantité suffisante de travail. À mon avis, le NSSplitView était jamais un problème pour ceux qui ne l'ont pas lu la documentation assez bien.
De la solution réelle du problème évoqué ici est assez simple: Mise en page Automatique introduit la nouvelle "la Tenue des Priorités de l'API" sur NSSplitView. Et comme le dit la documentation: Réglage des valeurs inférieures à la tenue de priorité d'une sous-vue va lui faire plus de chances de prendre de la largeur antérieure. Tout cela peut être réglé dans l'IB et par programme, sans désespoir. La quantité de travail nécessaire: 20 secondes environ.
Je charge tous par une plume fichier et
setTranslatesAutoresizingMaskIntoConstraints:NO
par la suite.Alors peut-être vous devez d'abord ajouter par
[mySplitView addSubview:myView];
votre point de vue et de désactiver par la suite la traduction de le redimensionnement automatique de masque à des contraintes et après cela, vous ajoutez votre contrainte àmyView
.EDIT:
Ok, il semble que je missunderstand la mavue.
Vous devez ajouter la contrainte de la sous-vues et de ne pas l'écran à double affichage splitview.
Vous n'avez pas à ajouter de bord de contraintes (le "|" en "V:|[topPane(34)]"), car les sous-vues dans
NSSplitView
sont déjà d'un redimensionnement automatique.Cela a conduit à cela par exemple pour la topPane contrainte:
REMARQUE: ignorer la sous-vue du contenu, ils sont juste des espaces réservés
translatesAutoresizingMaskIntoConstraints
àNO
pourmyView
, split view ne le sera pas, c'est la taille qu'il ne fonctionne pas avec mise en page automatique.Il m'a fallu un certain temps pour obtenir mon propre mise en page automatique de mises en garde, mais j'ai eu il a traité de l'IB (plusieurs splitviews et les sous-vues).
Ma mise en page ressemble à ceci:
RootView
|--1er NSSplitView (3 verticale des sous-vues)
|----UIView (à gauche)
|----2e NSSplitView (centre & 2 horizontal des sous-vues)
|---UIView (en haut)
|---3ème NSSplitView (bas & 3 verticale des sous-vues)
|---UIView (à gauche)
|---UIView (centre)
|---UIView (à droite)
|----UIView (à droite)
Mon problème, c'est que j'ai eu 19 Avertissements dans tous mes sous-vues, mais ma mise en page avait l'air bien travaillé et comment il devrait être.
Après un moment, j'ai trouvé la cause de mes mises en garde: les contraintes de l'extérieur, vues dans mon premier écran à double affichage splitview.
Les deux points de vue (gauche et droite) ont une largeur contrainte de la "largeur >= 200" et le centre de la vue (2ème écran à double affichage splitview) n'avait pas de contraintes (parce que sa min-width et max-width où traitées par ses sous-vues).
Les mises en garde m'a montré que la mise en page automatique veut rétrécir mon IB-INTERFACE utilisateur-Mise en page, car le calcul de min-largeurs où plus petit que ma mise en page, mais je n'ai pas envie de la réduire au bureau de l'IB.
J'ai ajouté une contrainte fixe "width = 200" à la fois de l'extérieur des sous-vues de mon premier écran à double affichage splitview et coché la case "supprimer au moment de la construction".
Maintenant, ma mise en page est libre de mises en garde et tout fonctionne, comment il devrait être.
Ma conclusion:
Je pense que le problème avec mise en page automatique et splitviews est que la mise en page automatique ne peut pas gérer la largeur des contraintes de la sous-vues. La raison pour laquelle nous voulons utiliser splitviews est, que nous voulons dynamique de la largeur des points de vue et nous voulons que dans les deux directions, réduire et expans.
Donc il n'y a pas de largeur <= xxx && largeur >= xxx . Mise en page automatique ne peut gérer qu'une de il et de nous obtenir des avertissements de l'IB. Vous pouvez résoudre ce problème avec une contrainte temporaire à l'IB qui sera retiré avant l'exécution.
J'espère que ça a du sens ce que j'ai écrit, mais il a bien fonctionné dans mon projet.
PS: je ne pourrais pas trouvé de solution jusqu'à aujourd'hui où j'ai trouvé ce fil.. donc je suppose que vos messages m'ont inspiré 🙂
J'ai utilisé cette classe comme une solution de contournement, il n'est pas parfait (les sous-vues bégayer un peu) mais il débloqué moi. J'utilise cette classe comme la classe personnalisée à l'intérieur de chaque division du volet vue.