2009-12-21 6 views
0

Я хочу, чтобы иметь возможность сэкономить CGContext в мои NSUndoManager с использованием этих методовКак бы я сохранить CGContext в NSUndoManager

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPoint = [touch locationInView:self.view]; 
      currentPoint.x = currentPoint.x; 
      currentPoint.y = currentPoint.y; 
      mouseSwiped = YES; 
      UIGraphicsBeginImageContext(self.view.frame.size); 
      [drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
      CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), YES); 
      CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
      CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brushSizeVal); 
      CGContextSetAlpha(UIGraphicsGetCurrentContext(), drawingColorAlpha); 
      CGContextSaveGState(UIGraphicsGetCurrentContext()); //Probably right here 
      CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 
             drawingColorRed, 
             drawingColorGreen, 
             drawingColorBlue, 
             drawingColorAlpha); 
      CGContextBeginPath(UIGraphicsGetCurrentContext()); 
      CGContextMoveToPoint(UIGraphicsGetCurrentContext(), 
            lastPoint.x, 
            lastPoint.y); 
      CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), 
            currentPoint.x, 
            currentPoint.y); 
      CGContextStrokePath(UIGraphicsGetCurrentContext()); 
      drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); //drawImage is the UIImageView that I am drawing my context to 
       NSLog(@"current point x: %d current point y: %d",currentPoint.x, currentPoint.y); //Used for my purposes 
      lastPoint = currentPoint; 
      mouseMoved++; 

и

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if (!optionsDisplayerVisible && canDraw) 
    { 
     if(!mouseSwiped) 
     { 
      UIGraphicsBeginImageContext(self.view.frame.size); 
      [drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
      CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), YES); 
      CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
      CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brushSizeVal); 
      CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 
             drawingColorRed, 
             drawingColorGreen, 
             drawingColorBlue, 
             drawingColorAlpha); 
      CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
      CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
      CGContextStrokePath(UIGraphicsGetCurrentContext()); 
      CGContextFlush(UIGraphicsGetCurrentContext()); 
      drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); //drawImage is the UIImageView that I am drawing to 
      UIGraphicsEndImageContext(); 
     } 
    } 
} 

Кстати, если вы хотите знать, У меня есть мой NSUndoManager с именем undoDrawing

ответ

1

Я не верю, что вы хотите сохранить CGContext, так как это часть стека, которая не будет действительна, когда вам это понадобится позже. Вместо этого просто сохраните изображение. Во-первых, не создавайте контекст во всем кадре. Вам просто нужен прямоугольник между currentPoint и lastPoint. Затем, прежде чем вы начнете рисовать, возьмите изображение из текущего контекста (UIGraphicsGetImageFromCurrentImageContext()) и сохраните его вместе с фреймом в NSUndoManager.

Если вы не знакомы с оптимизацией рисунка только к грязному прямоугольнику, начните с более простой версии этого и просто сохраните все изображение на нестационар, прежде чем рисовать на нем.