Ecco una tecnica che è simile a Matt Gallagher, che genererà una maschera di testo invertita con un'immagine.
Assegnare un buffer di dati (modificabile). Creare un contesto bitmap con un canale alfa a 8 bit. Configura le impostazioni per il disegno del testo. Riempi l'intero buffer in modalità copia (il colore predefinito assume il valore alfa 1). Scrivi il testo in modalità chiara (valore alfa di 0). Crea un'immagine dal contesto bitmap. Usa la bitmap come maschera per creare una nuova immagine dall'immagine sorgente. Crea un nuovo UIImage e ripulisci.
Ogni volta che i valori textString o sourceImage o size cambiano, ricreare l'immagine 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);
Un altro modo per farlo consiste nel mettere il textImage in un nuovo livello e l'impostazione che strato su strato del vostro punto di vista. (Rimuovere le linee che creano "newImage" e "finalImage".) Supponendo che questo accade all'interno del codice del vostro vista da qualche parte:
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;
Non ci sono più alternative, alcuni potrebbe essere migliore (sottoclasse UIImage e disegnare il testo direttamente in chiaro modalità dopo che la superclasse ha fatto il suo disegno?).
Finora, dalle immersioni ulteriormente nella documentazione in quarzo eccitanti, credo che ho bisogno di usare '' CGContextSetTextDrawingMode' e kCGTextClip' – runmad
Vedere la mia risposta a http://stackoverflow.com/questions/19787238/transparent- uilabel-textcolor-on-superview-superview-sort-of per un approccio basato su path a questo problema. –