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パスを作る必要があります。

0

3 答え

You have to use 2 mutable arrays(bezierpaths &color) , one integer variable(brush size). and one UIColor variable for 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++;
}

    }
4
追加された

mouseDownで新しいパスを開始するように思えます。そうしないと、既存のパスに行が追加されます。

私の提案はあなたのパスを保持するためのNSMutableArrayを持つことです。次に、 [myArray objectAtIndex:myIndex] を使って色を変更する特定のパスを見つけることができます。

1
追加された
配列には何がありますか? NSBezierPathオブジェクト?私はあなたが何を意味するか分からないのですか?あなたは擬似コードの例を提供できますか?
追加された 著者 Alex,
@Alex:パスごとに異なるストロークの色とストロークの幅が必要な場合は、それらの周囲に複数の色を保持する必要があります。パスと色を所有するオブジェクトを作成し、そのオブジェクトを配列内に保持することをお勧めします。オブジェクトを作成し、その色とパスの線幅を mouseDown:に設定します。
追加された 著者 Peter Hosey,
うん、新しいNSBezierPathを1つずつmouseDownします。私はあなたがあなたのアプリですでにそれらを使っているので、あなたがNSBezierPathを作る方法を知っていると思います。いったんあなたが[myArray addObject:myBezierPath]と呼ぶパスを作ったら、
追加された 著者 sosborn,

私はこれを本当に理解するためにいくつかのコードが不足していると感じていますが、理解できるところからは1つのパスしかありません。私は実際にこのスニペットから、描画するたびに灰色の色と同じ幅を使用しているので、パスの色が変化することに驚いています。

さらに、mouseDownでは、最後のパスに常に行を追加します。パス全体には1つの色しかありません。サブクラス化またはハイブリッド構造のいずれかによって、毎回新しいパスを作成し、その色を保存する必要があります。主なアイデアは、1つのBezierPathは1つの色と1つのストローク幅しか持つことができません。

0
追加された