path = [NSBezierPath bezierPathWithOvalInRect:[self currentRect]];

  • path = [NSBezierPath bezierPathWithOvalInRect:[self currentRect]];

    Hi,
    kurze frage sehe ich das richtig das ich die oben genannte methode nur mit einem Array in meinem APP einzeichnen kann...

    mit dem untereren code kann ich frei hand zeichen was ich moechte...
    aber mit der bezierPathWithOval methode muss ich denk ich nen OBJECT frei geben wenn ich die
    Maustaste loslasse , um es zu zeichnen is it Right ?

    MouseUp --> [ path addobject ];

    und im drawRect halt sagen zeichne es oder gibt es eine andere moeglichkeit...?



    Quellcode

    1. //
    2. // StretchView.m
    3. // Challenge@262_1
    4. //
    5. // Created by Nico Feldmann on 10/10/08.
    6. // Copyright 2008 Hogeschool Drenthe. All rights reserved.
    7. //
    8. #import "StretchView.h"
    9. @implementation StretchView
    10. - (id)initWithFrame:(NSRect)rect {
    11. if (![super initWithFrame:rect])
    12. return nil;
    13. path = [[NSBezierPath alloc]init];
    14. [path setLineWidth:3.0];
    15. return self;
    16. }
    17. - (void) dealloc
    18. {
    19. [path release];
    20. [super dealloc];
    21. }
    22. - (void)drawRect:(NSRect)rect {
    23. [[NSColor yellowColor] set];
    24. if(path) {
    25. [path stroke];
    26. }
    27. }
    28. #pragma mark Events
    29. - (void)mouseDown:(NSEvent *)event
    30. {
    31. NSPoint p = [event locationInWindow];
    32. downPoint = [self convertPoint:p fromView:nil];
    33. currentPoint = downPoint;
    34. [path moveToPoint:currentPoint];
    35. }
    36. - (void)mouseDragged:(NSEvent *)event
    37. {
    38. NSPoint p = [event locationInWindow];
    39. currentPoint = [self convertPoint:p fromView:nil];
    40. //path = [NSBezierPath bezierPathWithOvalInRect:[self currentRect]];
    41. [path lineToPoint:currentPoint];
    42. [self setNeedsDisplay:YES];
    43. }
    44. - (void)mouseUp:(NSEvent *)event
    45. {
    46. NSPoint p = [event locationInWindow];
    47. currentPoint = [self convertPoint:p fromView:nil];
    48. [self setNeedsDisplay:YES];
    49. }
    50. - (NSRect)currentRect
    51. {
    52. float minX = MIN(downPoint.x, currentPoint.x);
    53. float maxX = MAX(downPoint.x, currentPoint.x);
    54. float minY = MIN(downPoint.y, currentPoint.y);
    55. float maxY = MAX(downPoint.y, currentPoint.y);
    56. return NSMakeRect(minX, minY, maxX-minX, maxY-minY);
    57. }
    58. @end
    Alles anzeigen
  • RE: path = [NSBezierPath bezierPathWithOvalInRect:[self currentRect]];

    Ja und Nein.

    Du erzeugt einen NSBezierPath im init:

    Quellcode

    1. path = [[NSBezierPath alloc]init];
    Den nutzt Du auch friedlich.

    Würdest Du Dir einen neuen Path auf die gleiche Variable mit der auskommentierten Zeile setzen, landet der sofort im ARP, wie Du festgestellt hast. Ein einfaches 'retain' würde schon helfen.
    Ein vernünftiger 'setter' ist aber weitaus sinnvoller, denn der ursprüngliche Pfad aus dem 'init' bleibt Dir erhalten bis zum Ender aller Tage Deines Programmes.

    Du kannst aber auch Deinen ursprünglichen Pfad erhalten, ihn mit 'removeAllPoints' entleeren und dann mit 'appendBezierPathWithOvalInRect:' wieder füllen.
    I would be embarrassed if they did not spy on me.
  • du musst mir das ma eben erlaeutern

    [ path retain ] ? halte ich path fest so lange bis ?

    'setter' ? dann kann ich Path halt setten aber wie und wann...?

    removeAllPoints ? ( denke brauche ich nicht weil ich eingentlich [path lineToPoint....]
    ersetzen wollte und nur Ovals zeichnen moechte mit der genannten methode...

    Ist ne Challenge

    vielleicht beispiele nur wenne zeit hast sonst muss ich mich da irgenwie selber reinfuchsen...
  • Original von dorenthe
    du musst mir das ma eben erlaeutern

    [ path retain ] ? halte ich path fest so lange bis ?


    Bis Du ihn mit einem 'release' oder 'autorelease' via ARP frei lässt.
    Das nennt sich Speichermanagement und gilt generell für Objekte in Cocoa.

    Original von dorenthe
    'setter' ? dann kann ich Path halt setten aber wie und wann...?

    Getter und setter kapseln das Speichermanagement. Setzen würde Du ihn direkt nach dem Erzeugen.
    Original von dorenthe
    removeAllPoints ? ( denke brauche ich nicht weil ich eingentlich [path lineToPoint....]
    ersetzen wollte und nur Ovals zeichnen moechte mit der genannten methode...


    Würde hier funktionieren.

    Original von dorenthe
    Ist ne Challenge

    vielleicht beispiele nur wenne zeit hast sonst muss ich mich da irgenwie selber reinfuchsen...

    Es gibt schon einige Beispiele, auch im Forum.

    EDIT:
    Ein einfacher 'setter' sähe so aus:

    Quellcode

    1. - (void) setPath: (id)newPath {
    2. [path release];
    3. path = [newPath retain];
    4. }
    I would be embarrassed if they did not spy on me.
  • Anstelle von:

    Quellcode

    1. //path = [NSBezierPath bezierPathWithOvalInRect:[self currentRect]];

    schreibst Du:

    Quellcode

    1. [self setPath:[NSBezierPath bezierPathWithOvalInRect:[self currentRect]]];


    Das sollte es schon sein, wenn der 'setter' da ist.
    I would be embarrassed if they did not spy on me.
  • oh sorry habe den einfachen setter von dir gar nich gesehen...

    ES FUNKTIONIERT , sau geil...

    ok das mit dem setten usw muss ich mir nochmal angucken...
    wenn mir was raten willst ( tutorial oder ne seite dafuer , Buch ) den rat nehme ich gerne an...

    danke dir...