Как нарисовать гладкий путь с NSBezierPath - PullRequest
0 голосов
/ 02 февраля 2011

Я сейчас прохожу путь с NSBezierPath:

- (void)drawRect:(NSRect)dirtyRect 
{
    [[NSColor blueColor] set];
    [path stroke];
}

Но линия кажется довольно уродливой (не гладкой)

Тогда я погуглил несколько решений и получил:

- (void)drawRect:(NSRect)dirtyRect 
{
    NSGraphicsContext *graphicsContext;
    BOOL oldShouldAntialias;

    graphicsContext = [NSGraphicsContext currentContext];
    oldShouldAntialias = [graphicsContext shouldAntialias];
    [graphicsContext setShouldAntialias:NO];

    [[NSColor blueColor] set];
    [path stroke];

    [graphicsContext setShouldAntialias:oldShouldAntialias];
}

Но для меня, заметив, изменился, я все-таки получил уродливый путь.

Есть предложения?

Спасибо за ответ.

Вот подробности:

  1. Создание приложения для какао (не на основе документов)
  2. Создать новый класс "StretchView"

StretchView.h

#import <Cocoa/Cocoa.h>

@interface StretchView : NSView {

    NSBezierPath *path;
}

-(void)myTimerAction:(NSTimer *) timer;

@end

StretchView.m

#import "StretchView.h"

@implementation StretchView

- (id)initWithFrame:(NSRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) {

        path = [[NSBezierPath alloc] init]; 
        NSPoint p = CGPointMake(0, 0); 
        [path moveToPoint:p]; 
        myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                   target:self
                                                 selector:@selector(myTimerAction:)
                                                 userInfo:nil
                                                  repeats:YES];
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect 
{
    NSLog(@"drawRect");

    [[NSColor blueColor] set];
    [path stroke];
}

-(void)myTimerAction:(NSTimer *) timer
{  
    NSPoint p = CGPointMake(a, b); //a, b is random int val
    [path lineToPoint:p]; 
    [path moveToPoint:p]; 
    [path closePath];

    [self setNeedsDisplay:YES];
} 

-(void)dealloc
{
    [path release]; 
    [super dealloc];
}

@end

3. Откройте интерфейсный конструктор и перетащите «представление прокрутки» в главное окно
4. Выберите «Представление прокрутки» и установите класс «StretchView» (в окне идентификации класса)

1 Ответ

0 голосов
/ 30 июня 2011

Использование lineToPoint просто создаст прямые зигзагообразные линии, даже как часть более безумного пути.Если под «гладким» вы подразумеваете «соблазнительный», то вам, вероятно, стоит проверить curveToPoint.Также обратите внимание, что эти методы «toPoint» уже перемещают точку, нет необходимости moveToPoint, если вы не собираетесь перемещаться в точку, отличную от того, где заканчивается ваша линия.

...