0

私は簡単な描画アプリを作成して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 パスを作成する必要があります。

4

3 に答える 3

4

2 つの可変配列 (bezierpaths &color)、1 つの整数変数 (ブラシ サイズ) を使用する必要があります。およびbrushColor用の1つの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++;
}

    }
于 2012-08-01T10:40:13.877 に答える
1

mouseDown で新しいパスを開始したいようです。それ以外の場合は、既存のパスに行を追加するだけです。

私の提案は、パスを保持する NSMutableArray を用意し、特定のパスを見つけ[myArray objectAtIndex:myIndex]て色を変更することです。

于 2011-11-13T00:36:51.167 に答える
0

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

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

于 2011-11-13T00:40:06.770 に答える