2011-11-12 69 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++; 
} 

    }