2012-05-01 2 views
0

J'ai un NSSplitView vertical, la sous-vue inférieure contient une vue personnalisée (par exemple NSView) et un NSTextView.NSSplitView redimensionne le NSView personnalisé contenu

NSView contient à l'intérieur deux NSButtons.

Lorsque je redimensionne le splitView, le rendant plus petit, le NSView contenant les boutons est également redimensionné. Je ne veux pas ce comportement.

Pour mieux expliquer mon problème s'il vous plaît voir l'image ci-jointe.

Image 1: la fenêtre au démarrage de l'application, tout est ok

Image 2: J'ai redimensionné rapetissant la vue split, seule une petite partie des boutons est visible

Image 3: Je ve agrandie à nouveau le point de vue partagé mais comme vous pouvez voir le NSView reste plus petit et les boutons ne sont plus visibles (si je redimensionnez la SPLITVIEW en bas le « disparait » NSView)

enter image description here

Répondre

0

C'est un pro vicieux blem qui est basé sur les fonctionnements hérités des vues Cocoa. La meilleure solution que j'ai vu est de contraindre la dimension minimum de n'importe quelle partie de la vue partagée. Si les sous-vues ne s'effondrent jamais, leurs métriques ne se croisent pas dans une autre dimension et elles devraient être bien agrandies. Pour ce faire, configurez un délégué pour votre vue partagée, qui implémentera - splitView:constrainMaxCoordinate:ofSubviewAt:. La vue fractionnée appelle votre méthode de délégué en espérant qu'elle peut quitter la position du diviseur max à la hauteur de la vue divisée (en passant le second argument), mais vous pouvez simplement soustraire une certaine quantité de cette valeur (par exemple, 60) pour retourner comme la hauteur minimale pour la vue de dessous.

- (CGFloat)splitView:(NSSplitView *)aSplitView 
constrainMaxCoordinate:(CGFloat)proposedMin 
      ofSubviewAt:(NSInteger)dividerIndex { 

    return proposedMin - 60; 
} 

Bien sûr, vous aurez probablement envie de faire plus de vérifier dans cette méthode pour vous assurer que vous parlez du droit vue split, et pour éviter les effets aille trop loin droit sous-vue, mais C'est l'idée de base.

(Voir aussi this fabulicious article sur le sujet.)

+0

Je l'effondrement SPLITVIEW à l'aide d'une animation de sorte que la contrainte ne permet pas tant, mais grâce à vous, j'ai une direction à suivre. Il est très étrange que lorsque je supprime le NSTextView le NSView n'est pas redimensionné – dafi

+0

Je pense que vous voulez dire 'constrainMinCoordinate' n'est-ce pas? – trojanfoe

+0

En fait, 'constrainMinCoordinate' contraint la coordonnée minimale du * divider, * pas la taille d'une sous-vue spécifique. Ainsi, la coordonnée * maximum * du diviseur * au-dessus * d'une vue permet de définir la hauteur minimale de cette vue. Confus, oui. – Violet

0

Contraindre la position de séparation n'a pas aidé dans mon cas, comme je suis et animant les sous-vues sous-vues peuvent être effondrés. J'ai réussi à obtenir une solution acceptable en implémentant la méthode de délégation splitView -splitviewWillResizeSubviews: (signifie que vous devez connecter la propriété delegate de la vue divisée à votre contrôleur en IB ou en code) pour maintenir une largeur minimum en réglant la sous-vue à cacher au lieu de rétrécir à zéro:

- (void)splitViewWillResizeSubviews:(NSNotification *)notification { 
    NSUInteger divider = [[[notification userInfo] valueForKey:@"NSSplitViewDividerIndex"] intValue]; 
    NSView *subview = nil; 
    if(divider == SPLITVIEW_DIVIDER_SIDEBAR) { 
     subview = (NSView*)[self.splitView.subviews objectAtIndex:SPLITVIEW_SIDEBAR_INDEX]; 
    } 
    if(subview) { 
     if(subview.frame.size.width < SPLITVIEW_MINIMUM_SIDEBAR_WIDTH) { 
      CGRect correctedFrame = subview.frame; 
      correctedFrame.size.width = SPLITVIEW_MINIMUM_SIDEBAR_WIDTH; 
      subview.frame = correctedFrame; 
      subview.hidden = YES; 
     } else { 
      subview.hidden = NO; 
     } 
    } 
} 
Questions connexes