Uiview UIBezierPath绘制线表示法

Uiview UIBezierPath绘制线表示法,uiview,drawing,representation,uibezierpath,Uiview,Drawing,Representation,Uibezierpath,我使用UIBezierPath和UIView的-touch…方法编写了一个简单的绘图代码。这幅画画得很好,但我有一些不好的经历 当我画得很慢时,效果很好。但我画得越快,线就越尖锐。那么,我怎样才能让“平滑”它们变得不那么急躁(更多点) 当我使用高线宽的setLineWidth时,线条变得非常难看 以下是一幅图,展示了丑陋的实际含义: 为什么它会这样画胖线 编辑:这里有一些代码 我希望有人能帮我解决这些问题。非常感谢,大家好,JulianMmmmh,我不会在这个线程中讨论您的实现的性能问题,但在

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

  • 当我画得很慢时,效果很好。但我画得越快,线就越尖锐。那么,我怎样才能让“平滑”它们变得不那么急躁(更多点)

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

  • 以下是一幅图,展示了丑陋的实际含义:

    为什么它会这样画胖线

    编辑:这里有一些代码


    我希望有人能帮我解决这些问题。非常感谢,大家好,Julian

    Mmmmh,我不会在这个线程中讨论您的实现的性能问题,但在基本工作正常后,请看一下UIView中的
    setNeedsDisplayInRect:

    我认为您基本上是在尝试从阵列中取出最后创建的路径,并在移动过程中用新路径替换它

    您应该尝试在数组中放置一个
    CGMutablePathRef
    (看看这里)

    基本流程如下所示:

  • 触摸开始

  • 创建
    CGMutablePathRef
  • 调用moveToPoint
  • 存储在数组中
  • 触摸移动

  • 从数组中获取最后一个对象(即
    CGMutablePathRef
  • 调用addLineToPoint
  • [自我设置需要显示]
  • 然后在drawInRect中,遍历路径并绘制它们


    同样,这将是缓慢的,首先,然后你需要优化
    CGLayerRef
    可以提供帮助
    setNeedsDisplayInRect
    肯定也会的。

    嗯,我不打算在这个线程中讨论您的实现的性能问题,但在基本工作正常后,请在UIView中查看一下
    setNeedsDisplayInRect:

    我认为您基本上是在尝试从阵列中取出最后创建的路径,并在移动过程中用新路径替换它

    您应该尝试在数组中放置一个
    CGMutablePathRef
    (看看这里)

    基本流程如下所示:

  • 触摸开始

  • 创建
    CGMutablePathRef
  • 调用moveToPoint
  • 存储在数组中
  • 触摸移动

  • 从数组中获取最后一个对象(即
    CGMutablePathRef
  • 调用addLineToPoint
  • [自我设置需要显示]
  • 然后在drawInRect中,遍历路径并绘制它们


    同样,这将是缓慢的,首先,然后你需要优化
    CGLayerRef
    可以提供帮助
    setNeedsDisplayInRect
    当然也会。

    你能分享设置路径的代码吗?我添加了一些代码。我是从内存中写的,所以可能在某个地方拼写错误。你能分享设置路径的代码吗?我添加了一些代码。我是凭记忆写的,所以可能在某个时候拼错了
    - (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;
    }