2017-03-12 3 views
0

j'ai réussi à mettre en œuvre des plans d'effacement sur CGContextComment effacer légérement un tracé tracé dans cgcontext?

UIImageView *maskImgView = [self.view viewWithTag:K_MASKIMG]; 
    UIGraphicsBeginImageContext(maskImgView.image.size); 
    [maskImgView.image drawAtPoint:CGPointMake(0,0)]; 
    float alp = 0.5; 

    UIImage *oriBrush = [UIImage imageNamed:_brushName]; 

    //sets the style for the endpoints of lines drawn in a graphics context 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    CGFloat eraseSize = oriBrush.size.width*_brushSize/_zoomCurrentFactor; 

    CGContextSetLineCap(ctx, kCGLineCapRound); 
    CGContextSetLineJoin(ctx, kCGLineJoinRound); 
    CGContextSetLineWidth(ctx,eraseSize); 
    CGContextSetRGBStrokeColor(ctx, 1, 1, 1, alp); 
    CGContextSetBlendMode(ctx, kCGBlendModeClear); 


    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, lastPoint.x,lastPoint.y); 

    CGPoint vector = CGPointMake(currentPoint.x - lastPoint.x, currentPoint.y - lastPoint.y); 
    CGFloat distance = hypotf(vector.x, vector.y); 
    vector.x /= distance; 
    vector.y /= distance; 

    for (CGFloat i = 0; i < distance; i += 1.0f) { 
     CGPoint p = CGPointMake(lastPoint.x + i * vector.x, lastPoint.y + i * vector.y); 
     CGContextAddLineToPoint(ctx, p.x, p.y); 
    } 

    CGContextStrokePath(ctx); 

    maskImgView.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    lastPoint = currentPoint; 

problème est, cette effacer quoi que ce soit TOTALEMENT. L'ensemble alpha de cette fonction (CGContextSetRGBStrokeColor(ctx, 1, 1, 1, alp);) semble totalement ignoré.

Je souhaite effacer légèrement et l'effacement répété supprime totalement le dessin.

Des idées?

EDIT: selon la demande, j'ajouter plus de détails sur ce code: alpe = _brushAlpha est une propriété delcared dans cette classe ViewController. Il va de 0,1 à 1,0. Au test je l'ai mis à 0.5. Ce code de dessin est déclenché par le système de reconnaissance de mouvement (changement d'état). Il s'agit essentiellement de suivre le doigt (dessiner/effacer par le doigt).

+0

Auriez-vous l'amabilité de dire au public, quelle est la valeur de 'alp' resp. '_brushAlpha' est? Cependant, où se trouve ce code de dessin? –

+0

Ok, j'ai ajouté plus de détails pour le code. – GeneCode

Répondre

1

Vous avez défini le mode de fusion à effacer. Cela ignore la couleur du trait. Vous devriez jouer avec les différents modes un peu, mais je suppose que vous voulez quelque chose comme sourceAtop ou peut-être l'écran. Voir le CGBlendMode docs pour plus de détails.

+0

Merci pour votre suggestion. Je vais essayer ce soir. – GeneCode

+1

J'ai réussi à le faire fonctionner en utilisant kCGBlendModeDestinationOut. Merci, vous avez indiqué la bonne direction. – GeneCode

0

Vous avez un indicateur nommé clearsContextBeforeDrawing dans UIView. Si vous le réglez sur YES, il sera effacé avant chaque tirage. conformément à la documentation

Une valeur booléenne qui détermine si les limites de la vue doivent être automatiquement effacées avant le dessin. Lorsqu'il est défini sur YES, le tampon de dessin est automatiquement effacé en noir transparent avant l'appel de la méthode drawRect:. Ce comportement garantit qu'il ne reste aucun artefact visuel lorsque le contenu de la vue est redessiné. Si la propriété opaque de la vue est également définie sur YES, la propriété backgroundColor de la vue ne doit pas être nulle ou des erreurs de dessin peuvent se produire. La valeur par défaut de cette propriété est YES. Si vous définissez la valeur de cette propriété sur NO, vous devez vous assurer que le contenu de la vue est correctement tracé dans votre méthode drawRect:. Si votre code de dessin est déjà fortement optimisé, définir cette propriété sur NON peut améliorer les performances, en particulier lors du défilement lorsque seule une partie de la vue doit être redessinée.

+0

Vous ne savez pas comment utiliser clearsContextBeforeDrawing puisque je n'utilise pas drawRect. J'ai édité ma question pour ajouter plus de détails. – GeneCode