objective-c uiview calayer cagradientlayer

objective c - Objetivo C: ¿CAGradientLayer cubre el texto en UILabel?



swift apply gradient (3)

Estoy intentando agregar un layet degradado a mi UILabel por alguna razón que CAGradientLayer cubra mi texto. Estoy haciendo algo mal

- (void)viewDidLoad { [super viewDidLoad]; CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = CGRectMake(0, 0, myLabel.frame.size.width, myLabel.frame.size.height); gradient.colors = myColors; [myLabel.layer insertSublayer:gradient atIndex:0]; }


CAGradientLayer está cubriendo el texto de su etiqueta porque el texto está dibujado por el contenido de la supercapa que explícitamente cubrió al agregar una subcapa.

Su solución más fácil es usar dos vistas. Una subclase UIView donde anula +[UIView layerClass] y devuelve un [CAGradientLayer] . Agregue un buen método init para configurar su gradiente.

Next pup añade el UILabel como una subvista de tu vista personalizada de degradado.


Yo tuve el mismo problema. Hice este método para obtener una referencia para la capa de forma y / o generarla si no estaba allí. Este método se asegura de tirar esa capa en la parte posterior para que no cubra la capa de texto de la etiqueta. Solo use esto y debería estar todo bien, no se requieren subclases adicionales.

- (CAShapeLayer*) getShapeLayerForObject: (UIView*) object{ CAShapeLayer *maskLayer; int loc = -1; for(int x = 0; x < object.layer.sublayers.count; x++){ if([[object.layer.sublayers objectAtIndex:x] isKindOfClass:[CAShapeLayer class]]){ loc = x; break; } } if(loc > -1){ maskLayer = (CAShapeLayer*) [object.layer.sublayers objectAtIndex:loc]; }else{ maskLayer = [[CAShapeLayer alloc] init]; [object.layer insertSublayer:maskLayer atIndex:0]; } return maskLayer; }


Si, por ejemplo, necesita subclasificar su UILabel , y luego agregar un CALayer que cubra el texto, se recomienda agregar CATextLayer a su CALayer , aquí hay un ejemplo rápido:

@IBDesignable class BWRoundedLabel: UILabel { override var text: String? { didSet { updateView() } } @IBInspectable override var shadowColor: UIColor? { didSet { updateView() } } private func updateView() { let width = bounds.size.width - 1 let height = bounds.size.height - 1 let shadowLayer = CAShapeLayer() shadowLayer.path = UIBezierPath(roundedRect: CGRectMake(0, 0, width, height), cornerRadius: width/2).CGPath shadowLayer.fillColor = UIColor.yellowOrange().CGColor shadowLayer.shadowColor = shadowColor?.CGColor shadowLayer.shadowPath = shadowLayer.path shadowLayer.shadowOffset = CGSize(width: 0, height: 1.0) shadowLayer.shadowOpacity = 1 shadowLayer.shadowRadius = 0 let textLayer = CATextLayer() textLayer.foregroundColor = UIColor.whiteColor().CGColor textLayer.string = text textLayer.fontSize = font.pointSize textLayer.font = "Calibri-Bold" textLayer.alignmentMode = kCAAlignmentCenter textLayer.frame = CGRectMake(0, (height - 16)/2, width, 16) if let sublayers = layer.sublayers { for sublayer in sublayers { sublayer.removeFromSuperlayer() } } layer.insertSublayer(shadowLayer, atIndex: 0) layer.insertSublayer(textLayer, atIndex: 1) } }