#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 может иметь только один цвет и одну ширину штриха.