指南针每个点的圆圈外边缘都被裁剪(大概是直边框)。如何让圆圈在框架内显示? (这是通过点击按钮创建的):
在我的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];
}
感谢。
答案 0 :(得分: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时使用该方法,并且从绘图方法调用它有点递归。这就是为什么我对你的代码真正吸引人的东西感到惊讶。
我还有另一个提示:[[NSApplication sharedApplication] mainWindow]
实际上与[NSApp mainWindow]
相同。 NSApp
是一个包含主应用程序的全局变量。
希望它有所帮助,
ief2