1

我使用 UIBezierPath 和-touches...UIView 的方法编写了一个简单的绘图代码。这幅画效果很好,但我有一些不好的经历。

  1. 当我画得很慢时,效果很好。但是我画得越快,线条就越前卫。那么我如何让它们“平滑”以变得不那么前卫(更多点)?

  2. 当我使用setLineWidth高线宽时,线条变得非常难看

这是一张显示丑陋实际含义的图像: 这实际上意味着

为什么会这样画脂肪线?!

编辑:这里有一些代码

- (void)drawInRect:(CGRect)rect
{
    for(UIBezierPath *path in pathArray) {
        [[UIColor blackColor] setStroke];
        [path setLineWidth:50.0];
        [path stroke];
    }
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    startPoint = [[touches anyObject] locationInView:self];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:startPoint];
    [path addLineToPoint:[[touches anyObject] locationInView:self]];
    if(isDrawing) {
        [pathArray removeLastObject];
    }
    else {
        isDrawing = YES;
    }
    [pathArray addObject:path];
    [path close];
    [self setNeedsDisplay];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    isDrawing = NO;
}

我希望有人可以帮助我解决这些问题。非常感谢,问候,朱利安

4

1 回答 1

1

嗯,我不会在这个线程中解决你的实现的性能问题,但是setNeedsDisplayInRect:一旦你掌握了基础知识,就在 UIView 中看看。

我认为您基本上是在尝试从阵列中取出最后创建的路径,并在您移动时将其替换为新路径。

您应该尝试将 aCGMutablePathRef放入您的数组中(在此处查看CGMutablePathRef 到 NSMutableArray)。

基本流程类似于:

  1. touchesBegan

    1. 创建CGMutablePathRef
    2. 调用 moveToPoint
    3. 存储在数组中
  2. touchesMoved

    1. 从您的数组中获取 lastObject(即CGMutablePathRef
    2. 调用 addLineToPoint
    3. [self setNeedsDisplay]

然后在 drawInRect 中,遍历你的路径并绘制它们。

同样,一开始这会很慢,然后您需要优化。CGLayerRef可以帮忙。setNeedsDisplayInRect肯定也会。

于 2012-05-04T12:14:47.220 回答