2011-11-12 102 views
0

我正在制作一个简单的绘图应用程序,并使用NSBezierPath来画线。我正在继承NSView。我需要制作一种方法,允许用户更改下一个路径的颜色和大小(所以用户按下一个按钮,然后下一次绘制路径时它是指定的颜色/大小),但是现在当我尝试这样做会改变所有现有路径的颜色和大小。我怎么能让他们“个人”,可以这么说呢?这里是我的代码:NSBezierPath独特线条

- (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

这听起来像你想在mouseDown上开始一个新的路径,否则你所做的就是将行追加到现有的路径。

我的建议是有一个NSMutableArray来保存你的路径,然后你可以找到一个具有[myArray objectAtIndex:myIndex]的特定路径来改变颜色。

+0

数组中会有什么? NSBezierPath对象?我不确定你的意思?你能提供一个伪码的例子吗? – Alex

+0

是的,你在每个mouseDown中创建一个新的NSBezierPath。我假设你知道如何制作NSBezierPath,因为你已经在你的应用中使用它们了。一旦你创建了路径,你只需调用[myArray addObject:myBezierPath] – sosborn

+1

@Alex:如果你想为每个路径使用不同的笔触颜色和笔划宽度,那么你还需要保留其中的一个以上。我建议制作一个拥有路径和颜色的对象,并将这些对象保留在数组中。创建对象并在'mouseDown:'中设置其颜色和路径的线宽。 –

0

我觉得我们错过了一些代码来真正理解这一点,但从我所能理解的,你只有一条路径。我从这段代码中惊讶地发现,从每次绘制时你的路径颜色都会发生变化,你正在使用灰色来绘制相同的宽度。

此外,在mouseDown中,您总是将一条线添加到最后一条路径。整个路径只能有一种颜色。您需要每次创建一个新路径,并通过子类化或混合结构来保存其颜色。主要思想,一个BezierPath只能有一个颜色和一个笔画宽度。

4

你必须使用2个可变数组(bezierpaths &颜色),一个整数变量(画笔大小)。 和一个用于brushColor的UIColor变量

-(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++; 
} 

    }