Disclaimer: Sto scrivendo questo senza test, quindi perdonami se sbaglio qui.
Si dovrebbe ottenere quello che ti serve per questi due passaggi:
Creare un CATextLayer
con la dimensione della visualizzazione, impostare il backgroundColor
di essere pienamente trasparente e foregroundColor
a essere opaco (da [UIColor colorWithWhite:0 alpha:1]
e [UIColor colorWithWhite:0 alpha:0]
. quindi impostare la proprietà string
alla stringa che si desidera rendere, font
e fontSize
ecc
impostare la maschera del livello di immagine per questo livello: myView.layer.mask = textLayer
. Dovrai importare QuartzCore
per accedere allo CALayer
della tua vista.
Si noti che è possibile passare dal colore opaco a quello trasparente nel primo passaggio.
Modifica: In effetti, Noah aveva ragione. Per superare questo problema, ho utilizzato CoreGraphics con la modalità di fusione kCGBlendModeDestinationOut
.
In primo luogo, una vista di esempio che mostra che funziona davvero:
@implementation TestView
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor clearColor];
}
return self;
}
- (void)drawRect:(CGRect)rect {
[[UIColor redColor] setFill];
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:10];
[path fill];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context); {
CGContextSetBlendMode(context, kCGBlendModeDestinationOut);
[@"Hello!" drawAtPoint:CGPointZero withFont:[UIFont systemFontOfSize:24]];
} CGContextRestoreGState(context);
}
@end
Dopo aver aggiunto questo al vostro controller della vista, si vedrà la vista dietro TestView
dove Hello!
è disegnato.
Perché fa questo lavoro:
Il metodo di fusione è definita come R = D*(1 - Sa)
, il che significa che abbiamo bisogno di valori alfa opposte rispetto al livello di mask
ho suggerito in precedenza. Pertanto, tutto ciò che devi fare è disegnare con un colore opaco e questo sarà sottratto dalle cose che hai disegnato sulla vista in anticipo.
Giusto per chiarire che stai utilizzando Core Text per disegnare e non UILabels? – feliun
Sì, è vero. – barndog