Я думаю, вы видите только половину края, верно? Вы можете рассчитать половину толщины края и вычесть ее из прямоугольника:
#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, и вызов его из метода рисования немного рекурсивен. Вот почему я удивлен, что твой код на самом деле что-то рисует.
И у меня есть еще один совет: [[NSApplication sharedApplication] mainWindow]
фактически совпадает с [NSApp mainWindow]
. NSApp
- это глобальная переменная, содержащая основное приложение.
Надеюсь, это поможет,
ief2