2

コンパスの各ポイントでの円の外縁が切り取られています (おそらく四角形のフレームによって)。フレーム内に円を表示するにはどうすればよいですか? (これはボタンのクリックから作成されています):

私の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];


  }

ありがとう。

4

1 に答える 1

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 を持っていないので、テストすることはできませんが、問題は解決すると思います。

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

もう 1 つのヒントがあります。[[NSApplication sharedApplication] mainWindow]は実際には と同じ[NSApp mainWindow]です。NSAppメインアプリケーションを含むグローバル変数です。

それが役立つことを願っています、
ief2

于 2011-02-09T15:42:22.700 に答える