2010-11-15 26 views
3

Je suis en train de sous-classer NSScroller pour essayer de le faire ressembler à comment "barres de défilement" regardent sur iOS. Je veux que ce soit juste une superposition représentant la position actuelle qui est dessinée sur ce qui est en dessous. Pour quelque raison que ce soit, si je redéfinis drawRect pour le défilement, les limites sont remplies de blanc. Est-il possible d'empêcher cela de sorte que je puisse simplement dessiner au-dessus de ce que ma sous-classe NSScroller est terminée? Dessiner avec des couleurs claires semble me rapprocher, mais il dessine «trop clair»: P Il dessine directement sur le bureau, quand je veux juste dessiner vers la fenêtre. Cette image pourrait le rendre plus clair alt textComment dessiner un NSScroller transparent

Des idées?

Répondre

9

sous-classes NSView font tout leur dessin à partir de drawRect. Si vous remplacez cette méthode dans une sous-classe, vous êtes responsable de faire tout le dessin (que ce soit par vos propres méthodes ou en faisant appel aux méthodes de super.) Par exemple, le code suivant dessine juste le nob de défilement et fait le reste le cadre de la barre de défilement transparent.

- (void)drawRect:(NSRect)dirtyRect { 

    // Do some custom drawing... 
    [[NSColor clearColor] set]; 
    NSRectFill(dirtyRect); 

    // Call NSScroller's drawKnob method (or your own if you overrode it) 
    [self drawKnob]; 
    } 

Ceci est plus d'une preuve de concept d'une suggestion de code réel (pas sûr quelles implications font ce montant minimal de dessin a sur le NSScroller.) NSScroller a également d'autres méthodes de dessin spécifiques que vous pouvez remplacer/appel une drawRect surchargée: méthode (disponible à partir d'informations docs de pomme: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSScroller_Class/Reference/Reference.html)

+0

Cela me fait très proche de ce que je cherche, mais va « trop loin ». Voir ma modification ci-dessus (l'image est avec le bouton de dessin commenté pour aider à illustrer). – BarrettJ

+0

J'ai trouvé la couleur dont j'ai besoin: [NSColor colorWithCalibratedWhite: 0.13 alpha: 0.855] – BarrettJ

+0

Merci. Ça m'a aidé. :) – Sid

0

Si vous voulez simplement dessiner au-dessus de ce que dessine la classe de base, appelez le [super drawRect:rect] avant de faire votre propre dessin. FWIW, Je ne suis pas sûr que vous obtiendrez l'effet que vous voulez en dessinant sur le dessin par défaut de NSScroller. Les défileurs de style iOS sont semi-transparents. Si vous appelez le super drawRect:, vous obtiendrez les scrollers bleus qui seront visibles à travers les scrollers transparents de style iOS. Vous voulez probablement éviter d'appeler super et simplement dessiner tout vous-même.

Si vous souhaitez réutiliser des morceaux du dessin NSScroller fait, la classe fournit de nombreuses méthodes pour ce faire, comme drawKnob, et drawArrow:highlight:, etc.

4

Si vous laissez tout à l'exception de tirer le bouton, vous pouvez obtenir un arrière-plan moins ... changeurs

- (void) drawRect: (NSRect) dirtyRect 
{ 
    [self drawKnob]; 
} 
+0

Bien que ce post date de quelques années, je veux juste mentionner que cela fonctionne toujours en utilisant Swift (et est assez facile). – Alex

+0

@Alex Cela fonctionne effectivement. Cependant, une fois que l'utilisateur a fini de défiler, cela ne masque pas la barre de défilement (même si vous êtes connecté via un trackpad). – Supertecnoboff

4

Alternativement, vous peut utiliser RFOverlayScrollView, une belle sous-classe de NSScroller qui est à la fois transparente et auto-masquée; et publié sous le MIT License.

RFOverlayScrollView

RFOverlayScrollView est une sous-classe NSScrollView qui montre son NSScroller dans le style iOS même quand est attaché une souris.

enter image description here

+0

Celui-ci est exactement le même que je cherchais. Merci pour l'aide. Tu as fait ma journée. Merci Monsieur. :) – Sid

+0

Exactement ma réaction quand je l'ai trouvé! Ne pas oublier de remercier l'auteur aussi;) –

+0

Classe fantastique, fonctionne parfaitement! (Même sur macOS High Sierra - Xcode 9). – Supertecnoboff