12

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];
}
4

3 に答える 3

12

CAGradientLayerサブレイヤーを追加して明示的にカバーしたスーパー レイヤーのコンテンツによってテキストが描画されるため、ラベルのテキストが で覆われています。

最も簡単な解決策は、2 つのビューを使用することです。をUIViewオーバーライド+[UIView layerClass]して返すサブクラス。[CAGradientLayer]グラデーションをセットアップするための適切な init メソッドを追加します。

UILabel次の子犬は、カスタム グラデーション ビューのサブビューとして追加します。

于 2011-08-26T19:18:54.577 に答える
1

私も同じ問題を抱えていました。このメソッドを作成して、シェイプレイヤーの参照を取得したり、存在しない場合は生成したりしました。このメソッドは、ラベル テキスト レイヤーを覆わないように、そのレイヤーを必ず後ろに投げます。これを使用するだけで、余分なサブクラスは必要ありません。

- (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;
}
于 2016-04-04T18:30:51.880 に答える
0

たとえば、 をサブクラス化し、テキストをカバーUILabelするものを追加する必要がある場合は、 に追加することをお勧めします。簡単な例を次に示します。CALayerCATextLayerCALayer

@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)
    }
}
于 2016-05-02T10:27:09.533 に答える