2011-02-09 4 views
2

나침반의 각 지점에서 내 원의 바깥 쪽 가장자리가 자르기 (아마도 직사각형 프레임으로)됩니다. 프레임 내에서 원을 표시하려면 어떻게합니까? (이것은 버튼 클릭에서 만들어지고) :코코아 NSView : 원을 만들었지 만 자른거야

을 내 AppController.m

#import "AppController.h" 
#import "MakeCircle.h" 

@implementation AppController 

- (IBAction)makeCircle:(id)sender { 

    MakeCircle* newCircle = [[MakeCircle alloc] initWithFrame:NSMakeRect(100.0, 100.0, 30.0, 30.0)]; 
    [[[[NSApplication sharedApplication] mainWindow] contentView] addSubview:newCircle]; 

    [newCircle release]; 
} 

@end 

에서 내 MakeCircle.m

- (void)drawRect:(NSRect)rect { 

    [self setNeedsDisplay:YES]; 

    [[NSColor blackColor] setStroke]; 

    // Create our circle path 
    NSBezierPath* circlePath = [NSBezierPath bezierPath]; 
    [circlePath appendBezierPathWithOvalInRect: rect]; 

    //give the line some thickness 
    [circlePath setLineWidth:4]; 

    // Outline and fill the path 
    [circlePath stroke]; 


    } 

감사합니다.

답변

6

가장자리의 반 밖에 보이지 않는 것 같은데, 맞습니까? 당신은 가장자리의 두께의 절반을 계산하고 사각형에서 해당 뺄 수 있습니다

#define STROKE_COLOR ([NSColor blackColor]) 
#define STROKE_WIDTH (4.0) 
- (void)drawRect:(NSRect)dirtyRect { 
    NSBezierPath *path; 
    NSRect rectangle; 

    /* Calculate rectangle */ 
    rectangle = [self bounds]; 
    rectangle.origin.x += STROKE_WIDTH/2.0; 
    rectangle.origin.y += STROKE_WIDTH/2.0; 
    rectangle.size.width -= STROKE_WIDTH/2.0; 
    rectangle.size.height -= STROKE_WIDTH/2.0; 
    path = [NSBezierPath path]; 
    [path appendBezierPathWithOvalInRect:rectangle]; 
    [path setLineWidth:STROKE_WIDTH]; 
    [STROKE_COLOR setStroke]; 
    [path stroke]; 
} 

나는 순간에 더 맥이 없다, 그래서 그것을 테스트 할 수 없습니다,하지만 난 당신의 문제를 해결한다고 생각합니다.

[self setNeedsDisplay:YES]을 호출하지 마십시오. 이 메소드는 전체 NSView를 다시 그릴 때 드로잉 메소드에서 호출하는 것이 재귀적일 때 사용됩니다. 그래서 당신의 코드가 실제로 무언가를 끌어내는 것에 놀랐습니다.

다른 팁이 있습니다. [[NSApplication sharedApplication] mainWindow]은 실제로 [NSApp mainWindow]과 같습니다. NSApp은 주 응용 프로그램을 포함하는 전역 변수입니다.

는 ief2

+4


는'NSInsetRect' 3 명 선으로 ​​코드를 단축 것, 그것은 도움이되기를 바랍니다. – Richard

+0

고마워, 나는 똑같은 것을 알아 냈다. 코코아에게 스트로크를 그리기위한 방법/속성이 없다. 포토샵에서 할 수있는 것과 비슷하다. 스트로크, 센터, 바깥 쪽. - 그리고 NSApp 팁을 주셔서 감사합니다 ... – PruitIgoe

+1

나는이 두 라인을 다음과 같이 변경했습니다 : rectangle.size.width - = STROKE_WIDTH/2; rectangle.size.height - = STROKE_WIDTH/2; to rectangle.size.width - = STROKE_WIDTH; rectangle.size.height - = STROKE_WIDTH; – PruitIgoe

관련 문제