2 votes

Comment fixer la hauteur de ma vue après avoir réduit NSSplitView ?

J'ai un NSSplitView avec un NSScrollView dans la vue du bas. Le problème est que lorsque je réduis la vue du bas et que je la rouvre, la hauteur de la vue du défilement dépasse la hauteur de la vue du bas, de sorte que la partie supérieure de la vue du défilement est coupée. J'ai réglé ma vue de défilement et ma vue fractionnée pour qu'elles s'agrandissent automatiquement dans toutes les directions dans IB. Dois-je ajuster la hauteur de cette vue de défilement après l'annulation de l'effondrement ou est-ce que je règle mal une propriété de redimensionnement, ou quelque chose d'autre ? Vous trouverez ci-dessous une image avant et après de ce à quoi ressemble l'écrêtage.

Avant l'effondrement :

alt text

Après avoir réduit et rouvert (remarquez que la barre de défilement dans la vue du bas est coupée)

alt text

4voto

Jon Hess Points 10529

Le problème vient du fait que les règles d'autorégulation du cacao fonctionnent en mettant à l'échelle les deltas de l'état précédent à l'état actuel. Si l'une des marges tombe à 0, elle ne sera jamais remise à l'échelle au fur et à mesure que la vue s'agrandit, en raison de la nature multaplicative de la mise à l'échelle.

L'approche typique pour contourner ce problème consiste à utiliser les méthodes du délégué NSSplitView pour éviter que la vue divisée ne devienne trop petite, puis à la fermer brusquement - ce qui, en interne, maintient la vue réduite à la taille minimale.

Voici un lien vers le site documentation sur la vue fractionnée .

De plus, si vous pensez à l'expérience de l'utilisateur, vos vues sont probablement très mauvaises lorsqu'elles sont réduites en dessous d'un certain point - les vues commencent probablement à se chevaucher et à devenir trop petites pour afficher leur contenu. L'ajout de ce comportement de "snapping-collapsing" permet de résoudre ces deux problèmes.

Si vous voulez en voir un exemple, Mail.app de Mac OS X ferme sa fenêtre de messages en ligne lorsqu'elle atteint une certaine hauteur. Vous devriez imiter ce comportement.

0voto

Cocoaster Points 1101

J'ai le même problème. Je l'ai résolu en utilisant les vues fractionnées de BWToolkit, qui permettent de déterminer la hauteur maximale et minimale de chaque vue.

0voto

alex gray Points 5089

Vous pourriez "réinitialiser" les choses via NSUserDefaults, éventuellement Il existe des touches pour des éléments tels que NSSplitView Subview Frames etc., auxquels vous pouvez attribuer des coordonnées, à la manière de 0.000000, 0.000000, 0.000000, 720.000000, NO

0voto

auco Points 2663

Jon Hess a bien décrit le problème (dès que la largeur d'une sous-vue devient égale à 0, les informations relatives au dimensionnement automatique sont perdues pour les éléments à largeur automatique), mais la solution n'est pas vraiment donnée pour tous les cas. Contraindre la largeur n'a pas aidé dans mon cas, car la sous-vue peut être réduite.

J'ai réussi à trouver une solution acceptable en mettant en œuvre la méthode de délégation splitView -splitviewWillResizeSubviews : pour maintenir une largeur minimale en définissant la sous-vue comme cachée au lieu de la réduire à 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;
            }
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X