gpt4 book ai didi

iphone - 尝试在 CGContext 中用颜色填充路径但运气不佳

转载 作者:行者123 更新时间:2023-11-28 22:46:45 24 4
gpt4 key购买 nike

我目前有以下代码尝试允许用户绘制虚线路径并制作自定义形状。一旦他们做出这个形状,我希望它能自动填充颜色。这不会发生。

目前我收到以下代码的错误:

<Error>: CGContextClosePath: no current point.

这是我使用的代码:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

UITouch *touch = [touches anyObject];

CGPoint previous = [touch previousLocationInView:self];
CGPoint current = [touch locationInView:self];

#define SQR(x) ((x)*(x))
//Check for a minimal distance to avoid silly data
if ((SQR(current.x - self.previousPoint2.x) + SQR(current.y - self.previousPoint2.y)) > SQR(10))
{

float dashPhase = 5.0;
float dashLengths[] = {10, 10};
CGContextSetLineDash(context,
dashPhase, dashLengths, 2);

CGContextSetFillColorWithColor(context, [[UIColor lightGrayColor] CGColor]);
CGContextFillPath(context);

CGContextSetLineWidth(context, 2);
CGFloat gray[4] = {0.5f, 0.5f, 0.5f, 1.0f};
CGContextSetStrokeColor(context, gray);

self.brushSize = 5;
self.brushColor = [UIColor lightGrayColor];

self.previousPoint2 = self.previousPoint1;
self.previousPoint1 = previous;
self.currentPoint = current;

// calculate mid point
self.mid1 = [self pointBetween:self.previousPoint1 andPoint:self.previousPoint2];
self.mid2 = [self pointBetween:self.currentPoint andPoint:self.previousPoint1];

if(self.paths.count == 0)
{

UIBezierPath* newPath = [UIBezierPath bezierPath];

CGContextBeginPath(context);

[newPath moveToPoint:self.mid1];
[newPath addLineToPoint:self.mid2];
[self.paths addObject:newPath];

CGContextClosePath(context);

}

else

{

UIBezierPath* lastPath = [self.paths lastObject];

CGContextBeginPath(context);

[lastPath addLineToPoint:self.mid2];
[self.paths replaceObjectAtIndex:[self.paths indexOfObject:[self.paths lastObject]] withObject:lastPath];

CGContextClosePath(context);

}

//Save
[self.pathColors addObject:self.brushColor];

self.needsToRedraw = YES;
[self setNeedsDisplayInRect:[self dirtyRect]];
//[self setNeedsDisplay];
}

}

为什么会这样,为什么路径内部没有填充颜色?

最佳答案

您的代码有几个问题:

  • 您应该在 View 的 drawRect: 方法中进行绘图,而不是触摸处理程序。
  • 永远不要为变量context 设置当前上下文的值。使用 UIGraphicsGetCurrentContext() 方法执行此操作。同样,在您的 drawRect: 方法中。
  • 您经历了创建 UIBezierPath 对象的麻烦,但您从未使用过它。通过调用 CGContextAddPath( context, newPath.CGPath ),根据需要在您使用 UIBezierPath 出现的两个地方更改变量名称。
  • 在您的触摸处理程序方法中保持对 setNeedsDisplayInRect: 的调用。这告诉系统使用您的(尚未实现的)drawRect: 方法绘制的绘图来更新您的 View 。

关于iphone - 尝试在 CGContext 中用颜色填充路径但运气不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13025146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com