2012-07-16 4 views
3

Je travaille sur un projet de dessin, où j'ai une option de gomme. Le code ci-dessous est pour quand je commence mon application et dessine quelques lignes et continue à employer la gomme. Cela fonctionne bien et j'obtiens l'effet de gomme. Maintenant, le deuxième scénario est où je dessine 10 lignes puis je clique sur le bouton "annuler" et je défais le tout, puis je refais le tout, et maintenant quand je clique sur le "bouton gomme" et j'essaie d'effacer une partie , mais à la place, cela effacera tout le dessin. C'est ce que j'essaie de comprendre, mais je ne comprends pas où je me trompe, alors, mes amis, aidez-moi s'il vous plaît.gomme ne fonctionne pas dans iOS dessin

Voici mon code.

- (void)drawRect:(CGRect)rect 
{ 


     case DRAW: 
    { 
     [m_curImage drawAtPoint:CGPointMake(0, 0)]; 

     CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2); 
     CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 



     [self.layer renderInContext:context]; 
     CGContextMoveToPoint(context, mid1.x, mid1.y); 
     CGContextAddQuadCurveToPoint(context, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y); 
     CGContextSetLineCap(context, kCGLineCapRound); 
     CGContextSetLineWidth(context, self.lineWidth); 
     CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor); 
     CGContextSetAlpha(context, self.lineAlpha); 
     CGContextSetAllowsAntialiasing(context, YES); 
     CGContextStrokePath(context); 
     //   [super drawRect:rect];   
    } 
     break; 



     case ERASE: 
     { 
      [m_curImage drawAtPoint:CGPointMake(0, 0)]; 
      CGContextRef context = UIGraphicsGetCurrentContext();  
      CGContextClearRect(context, rect);     
      CGContextSetBlendMode(context, kCGBlendModeClear); 
      [super drawRect:rect]; 
      break;     

    }  


     case UNDO: 
     { 
      [m_curImage drawInRect:self.bounds]; 
      break; 

     } 

     case REDO: 
     { 
      [m_curImage drawInRect:self.bounds]; 
      break;   
     } 


     default: 
      break; 
    }  
} 

Ce sont des fonctions qui s'exécutent lorsque je clique sur annuler/rétablir.

-(void)redrawLine 
{ 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0f); 
    [self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    NSDictionary *lineInfo = [m_lineArray lastObject]; 
    m_curImage = (UIImage*)[lineInfo valueForKey:@"IMAGE"]; 
    UIGraphicsEndImageContext(); 
    [self setNeedsDisplayInRect:self.bounds]; 
} 


-(void)undoButtonClicked 
{ 
    if([m_lineArray count] > 0) 
    { 
     NSMutableArray *line = [m_lineArray lastObject]; 
     [m_bufferArray addObject:line]; 
     [m_lineArray removeLastObject]; 
     [self redrawLine]; 
    } 
    m_drawStep = UNDO; 

} 

-(void)redoButtonClicked 
{ 
    if([m_bufferArray count] > 0) 
    { 
     NSMutableArray *line = [m_bufferArray lastObject]; 
     [m_lineArray addObject:line]; 
     [m_bufferArray removeLastObject];   
     [self redrawLine]; 
    } 
    m_drawStep = REDO; 

} 

S'il vous plaît dites-moi si je le fais bien.

Cordialement,

Ranjit

Répondre

4

J'ai résolu ce problème, le problème et est inférieur à la le code qui fonctionne parfaitement

case :ERASE 
{ 
CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2); 
      CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1); 

      [m_curImage drawAtPoint:CGPointMake(0, 0)]; 
      CGContextRef context = UIGraphicsGetCurrentContext(); 

      [self.layer renderInContext:context]; 
      CGContextMoveToPoint(context, mid1.x, mid1.y); 
      CGContextAddQuadCurveToPoint(context, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y); 
      CGContextSetLineCap(context, kCGLineCapRound); 


      CGContextSetBlendMode(context, kCGBlendModeClear); 
      CGContextSetLineJoin(context, kCGLineJoinRound); 
      CGContextSetLineWidth(context, self.lineWidth); 
      CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor); 
      CGContextSetShouldAntialias(context, YES); 
      CGContextSetAllowsAntialiasing(context, YES); 
      CGContextSetFlatness(context, 0.1f); 

      CGContextSetAlpha(context, self.lineAlpha); 
      CGContextStrokePath(context); 
} 

Cordialement Ranjit.

Cela a résolu mon problème, si quelqu'un a le même problème, s'il vous plaît implémenter cela.

+0

Je travaille également sur la même fonctionnalité, mais cet effacement ne fonctionne pas pour moi, Pouvez-vous m'aider s'il vous plaît .Quand je suis en mode effacement son dessin ne rien effacer ne rien effacer .. S'il vous plaît aidez-moi – Raj

+0

mode son dessin normalement, ne pas effacer quoi que ce soit .. S'il vous plaît aidez-moi – Raj

+1

J'ai résolu le problème, besoin de définir la couleur de fond de dessin pour effacer la couleur .. merci beaucoup pour vous solutions – Raj

2

Voici ce qui se passe est quand vous effacez le rect entier na ?? obtenir clair Donc, au lieu d'utiliser cette méthode d'effacement, tracez la ligne de la même couleur que celle de l'écran, de façon à ce qu'elle ressemble à une fenêtre en train d'être effacée et à ce que cela soit trop facile. Si votre écran de dessin est noir, dessinez une ligne pour les touches déplacées sur l'écran en couleur noire de sorte que cela ressemble à un effacement.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    lastPoint = [touch locationInView:imagevw]; 
    } 

    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPoint = [touch locationInView:imagevw]; 
    UIGraphicsBeginImageContext(self.imagevw.frame.size); 

    [self.imagevw.image drawInRect:CGRectMake(0, 0, self.imagevw.frame.size.width,  self.imagevw.frame.size.height)]; 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), width); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); // black color 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    imagevw.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

Ce code est tracer une ligne de couleur noire sur la vue noir ... juste essayer ... il peut vous aider ..

+0

ya thats bien, mais pouvez-vous me dire quel est le problème avec mon code?, Car il ne fonctionnera pas seulement sur annuler et refaire cela aussi quelques fois. – Ranjit

+0

Je ne sais pas exactement ce qui se passe, c'est peut-être parce que vous avez stocké tout le dernier objet tout en défaisant et en refaisant, après cela, si vous effacez, cela effacera tout ce que vous avez stocké pour l'action précédente. désolé –

+0

hey pas de problème Sandhya, c'est bien, de toute façon, merci beaucoup, vous avez ménagé votre temps à ma question. Avez-vous un autre moyen de stocker les opérations d'annulation et de rétablissement? – Ranjit

Questions connexes