Объект C - CAGradientLayer охватывает текст в UILabel?

Я пытаюсь добавить плагин градиента к моему 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];
}

Ответ 1

CAGradientLayer покрывает текст вашего ярлыка, потому что текст нарисован содержимым суперслова, который вы явно покрывали добавлением подуровня.

Самое простое решение - использовать два вида. A UIView, где вы переопределяете +[UIView layerClass] и возвращаете [CAGradientLayer]. Добавьте хороший метод init для настройки вашего градиента.

Следующий щенок добавляет UILabel в качестве подсмотра вашего пользовательского представления градиента.

Ответ 2

У меня была та же проблема. Я сделал этот метод, чтобы получить ссылку на слой формы и сгенерировать его, если его там не было. Этот метод позволяет бросить этот слой в спину, чтобы он не перекрывал текстовый слой метки. Просто используйте это, и все должно быть хорошо, никаких дополнительных подклассов не требуется.

- (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;
}

Ответ 3

Если вам, например, нужно подклассифицировать ваш 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)
    }
}