UIBezierPath绘制线表示

时间:2012-05-04 00:28:38

标签: uiview drawing representation uibezierpath

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

  1. 当我画得很慢时,效果很好。但是我画得越快,线就越锋利。那么我怎么喜欢“平滑”它们变得不那么尖锐(更多点)?

  2. 当我使用行宽较宽的setLineWidth时,该行变得非常丑陋

  3. 这是一张显示丑陋实际含义的图片: This actually means "ugly"

    为什么以这种方式吸引胖线?!

    编辑:这里有一些代码

    - (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;
    }
    

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

1 个答案:

答案 0 :(得分:1)

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

我认为你基本上是想从阵列中取出最后创建的路径,只要你移动就用新的路径替换它。

您应该尝试在数组中放置CGMutablePathRef(请在此处查看CGMutablePathRef to NSMutableArray)。

基本流程如下:

  1. touchesBegan

    1. 创建CGMutablePathRef
    2. 致电moveToPoint
    3. 存储在数组中
  2. touchesMoved

    1. 从数组中获取lastObject(即CGMutablePathRef
    2. 调用addLineToPoint
    3. [self setNeedsDisplay]
  3. 然后在drawInRect中,遍历您的路径并绘制它们。

    同样,这首先会很慢,然后你需要进行优化。 CGLayerRef可以提供帮助。 setNeedsDisplayInRect肯定也会。{/ p>