2012-05-07 165 views
3

我正在構建一個用於第一次繪製的iOS應用程序。現在我可以使用核心圖形繪製線條和曲線,但無法繪製UNDO。我在繪圖時保存了所有要點,並嘗試將它們重新用於UNDO和REDO,但沒有成功。任何人都可以幫助知道我做錯了什麼?使用核心圖形進行繪圖

任何幫助,高度讚賞。

這裏是我的代碼

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [tempPathArray removeAllObjects]; 
    UITouch *touch = [touches anyObject]; 

    previousPoint1 = [touch previousLocationInView:self]; 
    previousPoint2 = [touch previousLocationInView:self]; 
    currentPoint = [touch locationInView:self]; 

} 

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

    UITouch *touch = [touches anyObject]; 

    previousPoint2 = previousPoint1; 
    previousPoint1 = [touch previousLocationInView:self]; 
    currentPoint = [touch locationInView:self]; 


    // calculate mid point 
    CGPoint mid1 = midPoint(previousPoint1, previousPoint2); 
    CGPoint mid2 = midPoint(currentPoint, previousPoint1); 

    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathMoveToPoint(path, NULL, mid1.x, mid1.y); 
    CGPathAddQuadCurveToPoint(path, NULL, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y); 
    CGRect bounds = CGPathGetBoundingBox(path); 
    CGPathRelease(path); 

    drawBox = bounds; 

    //Pad our values so the bounding box respects our line width 
    drawBox.origin.x  -= self.lineWidth * 2; 
    drawBox.origin.y  -= self.lineWidth * 2; 
    drawBox.size.width  += self.lineWidth * 4; 
    drawBox.size.height  += self.lineWidth * 4; 

    UIGraphicsBeginImageContext(drawBox.size); 
    [self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    curImage = UIGraphicsGetImageFromCurrentImageContext(); 
    [curImage retain]; 
    UIGraphicsEndImageContext(); 

    [tempPathArray addObject:[NSValue valueWithCGRect:drawBox]]; 


    [self setNeedsDisplayInRect:drawBox]; 

} 

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

    [pathArray addObject:tempPathArray]; 
    NSLog(@"path array count %d", [pathArray count]); 
} 

    - (void)drawRect:(CGRect)rect 
{ 
    NSLog(@"draw rect"); 
    [curImage drawAtPoint:CGPointMake(0, 0)]; 
    CGPoint mid1 = midPoint(previousPoint1, previousPoint2); 
    CGPoint mid2 = midPoint(currentPoint, previousPoint1); 

    context = UIGraphicsGetCurrentContext(); 

    [self.layer renderInContext:context]; 

    CGContextMoveToPoint(context, mid1.x, mid1.y); 
    // Use QuadCurve is the key 
    CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y); 

    CGContextSetLineCap(context, kCGLineCapRound); 
    CGContextSetLineWidth(context, self.lineWidth); 
    CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor); 

    CGContextStrokePath(context); 
    [super drawRect:rect]; 

} 

    -(void)undoButtonClicked 
{ 

    KidsPhotoBookAppDelegate *appDelegate = (KidsPhotoBookAppDelegate*)[[UIApplication sharedApplication]delegate]; 


    if([pathArray count]>0){ 
     [bufferArray addObject:[pathArray lastObject]]; 
     [pathArray removeLastObject]; 

     for (NSMutableArray *tempArray in pathArray) { 
      for (int i = 0; i < [tempArray count]; i++) { 
       CGRect draw = [[tempArray objectAtIndex:i] CGRectValue]; 
       [self setNeedsDisplayInRect:draw]; 
      } 
     } 
    } 


} 

回答

0

試試這個:

  1. 畫一條線。
  2. 在第一行上畫另一條線。
  3. 撤消。

我懷疑你會看到它主要是工作 - 重疊第一行的第二行的部分將消失,只有沒有保留的部分。

問題是,您正在設置需要顯示在您仍然擁有的繪圖部分上,但不是您剛纔騰出的部分。這與你應該做的完全相反:你仍然擁有的部分不需要重繪,因爲它們沒有改變,而你騰出的部分需要重繪,因爲它已經改變了。

所以,設置需要顯示在你要移除的路徑區域,就在你刪除它之前。你不需要設置需要顯示其他任何東西。

+0

其實我無法理解你的理論。我害怕我無法達到你的理解水平。你可以進一步解釋一下嗎? –

+0

@GhazanfarAli:就像我說的,你需要在你還有的部分上設置需要的顯示,但是這些不需要重新繪製。您需要重繪的區域是您剛刪除路徑的區域。因此,設置需要僅顯示在您要刪除的路徑區域,而不是您要保留的路徑區域。 –

+0

哦thanx,我明白了你的觀點... –