est ici une technique qui est similaire à Matt Gallagher, qui va générer un masque de texte inversé avec une image.
Allouer un tampon de données (mutable). Créez un contexte bitmap avec un canal alpha de 8 bits. Configurez les paramètres pour le dessin de texte. Remplissez le tampon entier en mode copie (couleur par défaut supposée avoir une valeur alpha de 1). Ecrire le texte en mode clair (valeur alpha de 0). Créer une image à partir du contexte bitmap. Utilisez le bitmap comme masque pour créer une nouvelle image à partir de l'image source. Créez un nouveau UIImage et nettoyez-le.
Chaque fois que les valeurs textString ou sourceImage ou size changent, recréez l'image finale.
CGSize size = /* assume this exists */;
UIImage *sourceImage = /* assume this exists */;
NSString *textString = /* assume this exists */;
char *text = [textString cStringUsingEncoding:NSMacOSRomanStringEncoding];
NSUInteger len = [textString lengthOfBytesUsingEncoding:cStringUsingEncoding:NSMacOSRomanStringEncoding];
NSMutableData *data = [NSMutableData dataWithLength:size.width*size.height*1];
CGContextRef context = CGBitmapContextCreate([data mutableBytes], size.width, size.height, 8, size.width, NULL, kCGImageAlphaOnly);
CGContextSelectFont(context, "Gill Sans Bold", 64.0f, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGContextFillRect(context, overlay.bounds);
CGContextSetBlendMode(context, kCGBlendModeClear);
CGContextShowTextAtPoint(context, 16.0f, 16.0f, text, len);
CGImageRef textImage = CGBitmapContextCreateImage(context);
CGImageRef newImage = CGImageCreateWithMask(sourceImage.CGImage, textImage);
UIImage *finalImage = [UIImage imageWithCGImage:newImage];
CGContextRelease(context);
CFRelease(newImage);
CFRelease(textImage);
Une autre façon de faire consiste à mettre l'textImage dans une nouvelle couche et la mise en ce calque sur la couche de votre point de vue. (Supprimez les lignes qui créent « newImage » et « finalImage ».) En supposant que cela se produit quelque part dans le code de votre vue:
CALayer *maskLayer = [[CALayer alloc] init];
CGPoint position = CGPointZero;
// layout the new layer
position = overlay.layer.position;
position.y *= 0.5f;
maskLayer.bounds = overlay.layer.bounds;
maskLayer.position = position;
maskLayer.contents = (__bridge id)textImage;
self.layer.mask = maskLayer;
Il y a plus d'alternatives, certains pourraient être mieux (sous-classe UIImage et dessiner le texte directement en clair mode après que la superclasse a fait son dessin?).
Jusqu'à présent, de la plongée plus loin dans les docs passionnants de quartz, je crois que je dois utiliser '' CGContextSetTextDrawingMode' et kCGTextClip' – runmad
Voir ma réponse à http://stackoverflow.com/questions/19787238/transparent- uilabel-textcolor-on-superview-superview-sort-of pour une approche basée sur le chemin de ce problème. –