2012-10-23 48 views
0

我目前有以下代碼嘗試並允許用戶繪製虛線路徑並製作自定義形狀。一旦他們做了這個形狀,我想它會自動填充顏色。這沒有發生。試圖用CGContext中的顏色填充路徑沒有太多運氣

目前我收到此錯誤代碼如下:

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

} 

這究竟是爲什麼?爲什麼是在裏面路徑沒有被填充顏色?

+0

我對自定義繪圖沒有多少專業知識,但是如果我沒有記錯的話,繪圖應該(或甚至必須)在drawRect:方法中發生。也許這是這裏的問題? – Tobi

+0

,但用戶需要確定哪些線是繪製的,而不是應用程序:)所以我不得不使用touchesMoved不是嗎? –

+0

不,您可以將用戶觸摸的點保存到屬性或ivar中,然後在drawRect:方法中使用該點實際繪製到路徑。 – Tobi

回答

2

代碼有幾個問題:

  • 你應該在你的視圖的drawRect:方法,而不是觸摸處理器做繪圖。
  • 您從不爲變量context設置當前上下文的值。用UIGraphicsGetCurrentContext()方法做到這一點。再次,在您的drawRect:方法。
  • 您經歷了創建UIBezierPath對象的麻煩,但您從不使用它。通過調用CGContextAddPath(context, newPath.CGPath)來實現這一點,在使用UIBezierPath的兩個地方根據需要更改變量名稱。
  • 保持您的觸摸處理程序方法中的呼叫setNeedsDisplayInRect:。這告訴系統使用您的(尚未實現的)方法繪製的圖形來完成更新視圖的工作。
+0

謝謝!現在我設法讓自定義形狀具有顏色填充 - 請參閱:http://pixelbit.in/KL83,但是如何獲取自定義形狀的CGRect?有沒有簡單的方法? :-) –

+0

關於如何找到路徑的邊界框,請參閱ifo的這個問題:http://stackoverflow.com/questions/2587751/an-algorithm-to-find-bounding-box-of-closed-bezier-曲線 – kamprath