Cocoa NSView: создание кругов, но они обрезаются

внешние края моего круга в каждой точке компаса обрезаются (предположительно, прямоугольной рамкой). Как сделать так, чтобы круг отображался внутри рамки? (Это создается нажатием кнопки):

В моем 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];


  }

Спасибо.


person PruitIgoe    schedule 09.02.2011    source источник


Ответы (1)


Я думаю, вы видите только половину края, верно? Вы можете рассчитать половину толщины края и вычесть ее из прямоугольника:

#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

person v1Axvw    schedule 09.02.2011
comment
спасибо, вроде то же самое понял - нет метода/свойства, чтобы сказать какао, где рисовать обводку, аналогичную тому, что можно сделать в фотошопе - обводка внутри, по центру, снаружи? - и спасибо за совет NSApp... - person PruitIgoe; 09.02.2011
comment
Я изменил эти две строки с: прямоугольник.размер.ширина -= ШТРОК_ШИРИНА/2; прямоугольник.размер.высота -= ШТРОК_ШИРИНА/2; в прямоугольник.размер.ширина -= ШТРОК_ШИРИНА; прямоугольник.размер.высота -= ШТРОК_ШИРИНА; - person PruitIgoe; 09.02.2011