Mostrar UIView con una máscara de text UILabel

Estoy intentando agregar una UIView a una UILabel , para que el text sea la máscara de la vista, permitiéndome hacer cosas como backgrounds de text animados (como la diapositiva para desbloquear la label en la pantalla de locking).

La forma en que estaba planeando hacerlo era usar la propiedad de la mask en la layer la vista para enmascararla a la forma del text. Sin embargo, no puedo encontrar una forma de get la forma de text de CALayer como CALayer .

¿Es esto posible? Solo puedo encontrar soluciones que anulen el método -(void)drawRect: en el UILabel , pero esto no me daría mucha flexibilidad.

UIView agregó la propiedad maskView en iOS 8.0. Ahora, simplemente cree una UILabel para usarla como máscara para una UIView :

C objective:

 UILabel* label = [[UILabel alloc] initWithFrame:self.view.frame]; label.text = @"Label Text"; label.font = [UIFont systemFontOfSize:70]; label.textAlignment = NSTextAlignmentCenter; label.textColor = [UIColor whiteColor]; UIView* overlayView = [[UIView alloc] initWithFrame:self.view.frame]; overlayView.backgroundColor = [UIColor blueColor]; overlayView.maskView = label; [self.view addSubview:overlayView]; 

Swift 2 :

 let label = UILabel.init(frame: view.frame) label.text = "Label Text" label.font = UIFont.systemFontOfSize(70) label.textAlignment = .Center label.textColor = UIColor.whiteColor() let overlayView = UIView.init(frame: view.frame) overlayView.backgroundColor = UIColor.blueColor() overlayView.maskView = label view.addSubview(overlayView) 

Esto crea una UILabel nítida con color UIColor.blueColor() tomada de overlayView .

La solución de mopsled es más flexible si construyes para iOS 8+. Sin embargo, si está buscando una respuesta anterior a iOS 8, aquí está.


Gracias a Linuxios por apuntarme a esta pregunta . La key es utilizar CATextLayer lugar de UILabel .

C objective:

 CGRect textRect = {0, 100, self.view.frame.size.width, 100}; // rect to display the view in CATextLayer* textMask = [CATextLayer layer]; textMask.contentsScale = [UIScreen mainScreen].scale; // sets the layer's scale to the main screen scale textMask.frame = (CGRect){CGPointZero, textRect.size}; textMask.foregroundColor = [UIColor whiteColor].CGColor; // an opaque color so that the mask covers the text textMask.string = @"Text Mask"; // your text here textMask.font = (__bridge CFTypeRef _Nullable)([UIFont systemFontOfSize:30]); // your font here textMask.alignmentMode = kCAAlignmentCenter; // centenetworking text UIView* view = [[UIView alloc] initWithFrame:textRect]; view.backgroundColor = [UIColor blueColor]; view.layer.mask = textMask; // mask the view to the textMask [self.view addSubview:view]; 

Rápido:

 let textRect = CGRect(x: 0, y: 100, width: view.frame.size.width, height: 100) // rect to display the view in let textMask = CATextLayer() textMask.contentsScale = UIScreen.mainScreen().scale // sets the layer's scale to the main screen scale textMask.frame = CGRect(origin: CGPointZero, size: textRect.size) textMask.foregroundColor = UIColor.whiteColor().CGColor // an opaque color so that the mask covers the text textMask.string = "Text Mask" // your text here textMask.font = UIFont.systemFontOfSize(30) // your font here textMask.alignmentMode = kCAAlignmentCenter // centenetworking text let bgView = UIView(frame: textRect) bgView.backgroundColor = UIColor.blueColor() bgView.layer.mask = textMask // mask the view to the textMask view.addSubview(bgView)