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.
3 ответа
Вы должны использовать 2 изменяемых массива (bezierpaths &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++;
}
}
Похоже, вы хотите начать новый путь на mouseDown, в противном случае все, что вы делаете, это добавление линий к существующему пути.
Я предлагаю иметь NSMutableArray для хранения ваших путей, а затем вы можете найти конкретный путь с [myArray objectAtIndex:myIndex]
изменить цвет.
Я чувствую, что нам не хватает некоторого кода, чтобы действительно понять это, но из того, что я могу понять, у вас есть только один путь. Я на самом деле удивлен этим фрагментом, что цвет вашего пути меняется, так как каждый раз, когда вы рисуете, вы используете серый цвет для рисования и одинаковую ширину.
Кроме того, в mouseDown вы всегда добавляете строку к последнему пути. Весь путь может иметь только один цвет. Вам нужно будет каждый раз создавать новый путь и сохранять его цвет либо путем создания подклассов, либо с использованием гибридной структуры. Основная идея, один BezierPath может иметь только один цвет и одну ширину штриха.