Уникальные строки NSBezierPath

#objective-c #cocoa #drawing #unique #nsbezierpath

#objective-c #cocoa #рисование #уникальный #nsbezierpath

Вопрос:

Я создаю простое приложение для рисования и использую NSBezierPath для рисования линий. Я создаю подкласс NSView . Мне нужно создать метод, который позволяет пользователю изменять цвет и размер следующего пути (таким образом, пользователь нажимает кнопку, и в следующий раз, когда они рисуют путь, он имеет указанный цвет / размер), но прямо сейчас, когда я пытаюсь это сделать, он изменяет цвет и размер всех СУЩЕСТВУЮЩИХ путей. Как я могу сделать их, так сказать, «индивидуальными»? Вот мой код:

 - (void)drawRect:(NSRect)dirtyRect
{


    [path setLineWidth:5];

    [path setLineJoinStyle:NSRoundLineJoinStyle];
    [path setLineCapStyle:NSRoundLineCapStyle];

    [path stroke];


}

- (void)mouseDown:(NSEvent *)theEvent {

    NSPoint location = [theEvent locationInWindow];
    NSLog(@"%f, %f", location.x, location.y);

    [path moveToPoint:location];
    [self setNeedsDisplay:YES];

}

- (void)mouseUp:(NSEvent *)theEvent {

}

- (void)mouseDragged:(NSEvent *)theEvent {

    NSPoint location = [theEvent locationInWindow];
    [path lineToPoint:location];
    [self setNeedsDisplay:YES];

}

- (void)changeBrushColor:(NSString *)color {

     // change color of the next path

    [self setNeedsDisplay:YES];  // show it
}
  

Итак, мне нужно создать отдельные пути NSBezierPath.

Ответ №1:

Вы должны использовать 2 изменяемых массива (bezierpaths amp; color), одну целочисленную переменную (размер кисти). и одна переменная UIColor для brushColor

     -(IBAction) brushsizeFun
    {
    brushSize = 30; // any brush size here. better use a slider here to select size
    }

    -(IBAction) brushColorFun
    {
    brushColor = [UIColor redColor]; // Any color here. better use a color picker
    }


    - (void)mouseDown:(NSEvent *)theEvent {

    NSPoint location = [theEvent locationInWindow];
    NSLog(@"%f, %f", location.x, location.y);
    [path release];
    path = [[UIBezierpath alloc]init];
    path.lineWidth = brushSize;
    [path moveToPoint:location];
    [bezierArray addObject:path];
    [colorArray addObject:brushPattern];


    [self setNeedsDisplay:YES];

    }

    - (void)drawRect:(NSRect)dirtyRect
    {
    int q=0;
//Draw the bezierpath and corresonding colors from array
for (UIBezierPath *_path in bezierArray) 
{
    UIColor *_color = [colorArray objectAtIndex:q];
    [_color setStroke];
    [_path strokeWithBlendMode:kCGBlendModeNormal alpha:1.0]; 
    q  ;
}

    }
  

Ответ №2:

Похоже, вы хотите начать новый путь при наведении курсора мыши, в противном случае все, что вы делаете, это добавляете строки к существующему пути.

Я предлагаю создать NSMutableArray для хранения ваших путей, а затем вы сможете найти конкретный путь с [myArray objectAtIndex:myIndex] , чтобы изменить цвет.

Комментарии:

1. Что было бы в массиве? Объекты NSBezierPath? Я не совсем уверен, что вы имеете в виду? Не могли бы вы предоставить пример псевдокода, пожалуйста?

2. Да, вы создаете новый NSBezierPath по одной при каждом наведении курсора мыши. Я предполагаю, что вы знаете, как создать NSBezierPath, поскольку вы уже используете их в своем приложении. Как только вы создадите путь, вы просто вызовете [myArray AddObject:myBezierPath]

3. @Alex: Если вы хотите, чтобы для каждого контура был разный цвет обводки и ширина обводки, то вам также нужно сохранить несколько таких линий. Я рекомендую создать объект, которому принадлежат путь и цвет, и сохранить эти объекты в массиве. Создайте объект и задайте его цвет и ширину линии его пути в mouseDown: .

Ответ №3:

Я чувствую, что нам не хватает некоторого кода, чтобы действительно понять это, но из того, что я могу понять, у вас есть только один путь. Я действительно удивлен из этого фрагмента, что цвет вашего пути меняется, поскольку каждый раз, когда вы рисуете, вы используете серый цвет для рисования и ту же ширину.

Кроме того, при наведении курсора мыши вы всегда добавляете строку к последнему пути. Весь путь может иметь только один цвет. Вам нужно было бы каждый раз создавать новый путь и сохранять его цвет либо путем создания подкласса, либо используя гибридную структуру. Основная идея, один BezierPath может иметь только один цвет и одну ширину штриха.