【问题标题】:NSBezierPath Unique LinesNSBezierPath 独特的线条
【发布时间】:2011-11-12 23:54:31
【问题描述】:

我正在制作一个简单的绘图应用程序并使用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 路径。

【问题讨论】:

    标签: objective-c cocoa drawing unique nsbezierpath


    【解决方案1】:

    你必须使用 2 个可变数组(bezierpaths &color),一个整数变量(画笔大小)。 和一个用于画笔颜色的 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++;
    }
    
        }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 数组中有什么? NSBezierPath 对象?我不确定你的意思是什么?你能提供一个伪代码示例吗?
      • 是的,每个 mouseDown 都创建一个新的 NSBezierPath。我假设您知道如何制作 NSBezierPath,因为您已经在您的应用程序中使用它们。制作路径后,只需调用 [myArray addObject:myBezierPath]
      • @Alex:如果您想为每条路径使用不同的笔触颜色和笔触宽度,那么您还需要保留多个这样的路径。我建议制作一个拥有路径和颜色的对象,并将这些对象保存在数组中。创建对象并在mouseDown: 中设置其颜色和路径的线宽。
      【解决方案3】:

      我觉得我们缺少一些代码来真正理解这一点,但据我所知,你只有一条路。实际上,我对这个 sn-p 感到惊讶的是,您的路径颜色会发生变化,因为每次绘制时,您都使用灰色进行绘制并且宽度相同。

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

      【讨论】:

        猜你喜欢
        • 2012-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多