Quelle est la préférée/recommandé de tracer une ligne dans NSView-drawRect: méthode?
Je ne pouvais pas trouvé de dessin de la ligne primitive dans le Cacao au NSView niveau. La seule chose que j'ai trouvé est NSBezierPath. Est-ce une manière préférée? Ou est-il une autre façon que je ne pouvais pas découvert?
NSBezierPath est exactement ce que vous devriez être en utilisant. Si vous voulez juste pour tracer une ligne droite d'un point à un autre, utilisez la méthode de classe:
Cacao utilise implicitement le dessin de la pile, et une invalidation du modèle. Dans votre NSView, lorsque les changements d'état qui serait la cause de la vue de dessiner différemment, vous invoquez -[auto setNeedsDisplay:] pour dire le dessin du système que vous avez besoin d'être redessiné. À un certain point dans un avenir très proche, en fait à la fin de la boucle d'événements, de votre point de vue est drawRect: méthode sera appelée. C'est votre occasion pour attirer tout ce que vous voulez.
Il y a un accord implicite de l'accent de la pile, ce qui signifie que lorsque votre vue drawRect: est appelé, le dessin est porté sur et de couper les limites de votre point de vue dans la fenêtre. Vous pouvez ensuite appeler des fonctions comme [[NSColor redColor]]; et NSRectFill([auto limites]);
Voici un exemple:
@interfaceMyView:NSView{@privateNSColor*lineColor;NSInteger clickCount;}@end@implementationMyView-(void)setLineColor:(NSColor*)color {if(color != lineColor){[lineColor release];
lineColor =[color copy];[self setNeedsDisplay:YES];///We changed what we'd draw, invalidate our drawing.}}-(void)mouseDown:(NSEvent*)mouseDown {
clickCount =(clickCount ==6)?0:(clickCount +1);CGFloat hue = clickCount /6.0;[self setLineColor:[NSColor colorWithCalibratedHue:hue saturation:1.0 brightness:1.0 alpha:1.0]];}-(void)drawRect:(NSRect)dirtyRect {NSBezierPath*line =[NSBezierPath bezierPath];[line moveToPoint:NSMakePoint(NSMinX([self bounds]),NSMinY([self bounds]))];[line lineToPoint:NSMakePoint(NSMaxX([self bounds]),NSMaxY([self bounds]))];[line setLineWidth:5.0];///Make it easy to see[[self lineColor]set];///Make future drawing the color of lineColor.[line stroke];}@end
La vue doit tracer une ligne diagonale, et c'est chaque fois cliqué sur la ligne devrait changer de couleur.
La deuxième moveToPoint appel dans le darRect méthode doit être un lineToPoint appel. Fait! - Grâce.
Juste pour ajouter quelques infos, j'ai pour habitude de s'assurer de l'état graphique est enregistré et restauré avant et après l'application, afin de garder les choses zippy.
-(void)drawRect:(NSRect)dirtyRect {[[NSGraphicsContext currentContext] saveGraphicsState]NSBezierPath*line =[NSBezierPath bezierPath];[line moveToPoint:NSMakePoint(NSMinX([self bounds]),NSMinY([self bounds]))];[line lineToPoint:NSMakePoint(NSMaxX([self bounds]),NSMaxY([self bounds]))];[line setLineWidth:5.0];///Make it easy to see[[self lineColor]set];///Make future drawing the color of lineColor.[line stroke];[[NSGraphicsContext currentContext] restoreGraphicsState]}
NSBezierPath
est exactement ce que vous devriez être en utilisant. Si vous voulez juste pour tracer une ligne droite d'un point à un autre, utilisez la méthode de classe:+strokeLineFromPoint:(NSPoint)point1 toPoint:(NSPoint)point2
OriginalL'auteur Rob Keniger
Cacao utilise implicitement le dessin de la pile, et une invalidation du modèle. Dans votre NSView, lorsque les changements d'état qui serait la cause de la vue de dessiner différemment, vous invoquez -[auto setNeedsDisplay:] pour dire le dessin du système que vous avez besoin d'être redessiné. À un certain point dans un avenir très proche, en fait à la fin de la boucle d'événements, de votre point de vue est drawRect: méthode sera appelée. C'est votre occasion pour attirer tout ce que vous voulez.
Il y a un accord implicite de l'accent de la pile, ce qui signifie que lorsque votre vue drawRect: est appelé, le dessin est porté sur et de couper les limites de votre point de vue dans la fenêtre. Vous pouvez ensuite appeler des fonctions comme [[NSColor redColor]]; et NSRectFill([auto limites]);
Voici un exemple:
La vue doit tracer une ligne diagonale, et c'est chaque fois cliqué sur la ligne devrait changer de couleur.
Fait! - Grâce.
OriginalL'auteur Jon Hess
J'ai essayé l'exemple donné par Jon et constaté que j'avais besoin d'ajouter 2 corrections mineures à l'exemple de code ci-dessus.
Une fois que j'ai corrigé cela, j'ai trouvé le code snippit très utile.
REMARQUE: vous devrez probablement dealloc la NSColor.
OriginalL'auteur Ben
Juste pour ajouter quelques infos, j'ai pour habitude de s'assurer de l'état graphique est enregistré et restauré avant et après l'application, afin de garder les choses zippy.
OriginalL'auteur Adrian Sluyters