我正在尝试为我添加渐变布局 UILabel
由于某些原因 CAGradientLayer
涵盖我的文字。
我做错了什么
- (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
覆盖标签的文本,因为文本是通过添加子图层明确涵盖的超级图层的内容绘制的。
最简单的解决方案是使用两个视图。一个 UIView
您重写的子类 +[UIView layerClass]
并返回一个 [CAGradientLayer]
。添加一个好的init方法来设置渐变。
下一个小狗加了 UILabel
作为自定义渐变视图的子视图。
该 CAGradientLayer
覆盖标签的文本,因为文本是通过添加子图层明确涵盖的超级图层的内容绘制的。
最简单的解决方案是使用两个视图。一个 UIView
您重写的子类 +[UIView layerClass]
并返回一个 [CAGradientLayer]
。添加一个好的init方法来设置渐变。
下一个小狗加了 UILabel
作为自定义渐变视图的子视图。
我有同样的问题。我制作了这个方法来获取形状图层的参考,或者如果它不存在则生成它。此方法确保将该图层放在后面,以便它不会覆盖标签文本图层。只需使用它,你应该都很好,不需要额外的子类。
- (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;
}
例如,如果您需要子类化您的 UILabel
,然后添加一些 CALayer
其中涵盖了文字,建议添加 CATextLayer
到你的 CALayer
,这是一个很快的例子:
@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)
}
}