可可NSView:制作圈子,但它们正在被裁剪

Pru*_*goe 2 cocoa nsview nsbezierpath

罗盘每个点的圆圈外边缘都会被裁剪掉(大概是直边框架).如何让圆圈在框架内显示?(这是通过点击按钮创建的):

在我的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
Run Code Online (Sandbox Code Playgroud)

在我的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];


  }
Run Code Online (Sandbox Code Playgroud)

谢谢.

v1A*_*xvw 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];
}
Run Code Online (Sandbox Code Playgroud)

我目前没有Mac,所以我无法测试它,但我认为它应该可以解决你的问题.

Als不打电话[self setNeedsDisplay:YES].当您想要重绘整个NSView时使用该方法,并且从绘图方法调用它有点递归.这就是为什么我惊讶你的代码实际上吸引了一些东西.

我有另一个提示:[[NSApplication sharedApplication] mainWindow]实际上是相同的[NSApp mainWindow].NSApp是包含主应用程序的全局变量.

希望它
有所帮助,ief2

  • `NSInsetRect`会将代码缩短3行. (4认同)