Цель C - CAGradientLayer покрывает текст в UILabel? - PullRequest
12 голосов
/ 26 августа 2011

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

Ответы [ 3 ]

12 голосов
/ 26 августа 2011

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

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

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

0 голосов
/ 02 мая 2016

Если вам, например, необходимо создать подкласс 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)
    }
}
0 голосов
/ 04 апреля 2016

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

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