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)
}
}