2011-02-09 12 views
2

コンパスの各ポイントのサークルの外側のエッジが(おそらくrectフレームによって)切り取られています。フレーム内に円を表示するにはどうすればよいですか? (これは、ボタンのクリックから作成されたばかり):私のAppController.mでCocoa NSView:サークルを作成していますが、クロップしています

#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]; 
} 

私は、現時点では何のMacを持っていないので、私はそれをテストすることはできませんが、私はそれがあなたの問題を解決すべきだと思います。

[self setNeedsDisplay:YES]を呼び出していません。このメソッドは、NSView全体を再描画したい場合に使用され、描画メソッドからNSViewを呼び出すのは少し再帰的です。だから私はあなたのコードが実際に何かを描くのに驚いています。

私は別のヒントを持っています:[[NSApplication sharedApplication] mainWindow]は実際に[NSApp mainWindow]と同じです。 NSAppは、メインアプリケーションを含むグローバル変数です。

は IEF2

+4


は 'NSInsetRect'は3線でコードを短くなり、それがお役に立てば幸いです。 – Richard

+0

ありがとう、私は同じことを考え出しました。 - ココアにストロークを描画する方法/プロパティはありません。 - そしてNSAppのヒントのおかげで... – PruitIgoe

+1

私はこれらの2つの行を変更しました:rectangle.size.width - = STROKE_WIDTH/2; rectangle.size.height - = STROKE_WIDTH/2; 〜rectangle.size.width - = STROKE_WIDTH; rectangle.size.height - = STROKE_WIDTH; – PruitIgoe

関連する問題