2008-11-20 7 views
1

J'essaie de créer une sous-classe personnalisée de NSScroller. J'ai créé la classe et l'ai définie comme le défilement vertical sur un NSScrollView dans IB. Lorsque j'exécute mon projet, la méthode drawRect: est appelée pour ma sous-classe, donc je sais qu'elle est correctement connectée.Comment faire en sorte que ma sous-classe NSScroller ait une largeur différente?

Maintenant, comment est-ce que je change la largeur de mon nouveau NSScroller de fantaisie? Peu importe ce que je fais pour ses limites et son cadre, il veut toujours dessiner dans un rectangle de 15 pixels de large (la taille du NSScroller par défaut).

Répondre

2

Dans votre sous-classe NSScroller, vous devez remplacer scrollerWidth:

+(CGFloat)scrollerWidth 
{ 
    return 30.0; 
} 

Ceci est la valeur que NSScrollView utilise pour définir le cadre de votre composant quand il le met en place.

+0

J'ai essayé redéfinissant cette méthode, mais le problème est que NSScrollView appelle toujours cette méthode de classe sur NSScroller, au lieu de ma sous-classe personnalisée. Il existe une variable _verticalScrollerClass privée dans NSScrollView qui peut être modifiée, mais la substitution de variables privées n'est pas prise en charge. –

+0

Hmm ... cela peut arriver parce qu'il est archivé par IB à cette taille (originale). Avez-vous essayé de le programmer par programme pour voir si cela aide? –

+0

J'ai. Tout ce que j'ai lu suggère que le dépassement de ce ivar privé est la seule voie à suivre. J'ai fini par créer ma propre vue pour dupliquer la fonctionnalité de la barre de défilement et cacher complètement la barre de défilement par défaut. –

1

Vous pouvez utiliser des catégories pour remplacer la méthode de largeur de défilement pour tous les NSScrollers.

Par exemple. Dans NSScroller-MyScroller.h:

#import <Cocoa/Cocoa.h> 

@interface NSScroller (MyScroller) 

+ (CGFloat)scrollerWidth; 
+ (CGFloat)scrollerWidthForControlSize: (NSControlSize)controlSize; 

@end 

Dans NSScroller-MyScroller.m:

#import "NSScroller-MyScroller.h" 
#define SCROLLER_WIDTH 30.0 

@implementation NSScroller (MyScroller) 

+ (CGFloat)scrollerWidth { 
    return SCROLLER_WIDTH; 
} 

+ (CGFloat)scrollerWidthForControlSize: (NSControlSize)controlSize { 
    return SCROLLER_WIDTH; 
} 

@end 
Questions connexes