2017-11-24 7 views
0

は現在、私はこのようにそれを行う:透明な穴があるCAGradientレイヤーを作成しますか?

final class BorderedButton: BottomNavigationButton { 

private let gradient = CAGradientLayer() 
private let shapeLayer = CAShapeLayer() 

override func layoutSubviews() { 
    super.layoutSubviews() 

    let radius = bounds.size.height/2 
    let outside = UIBezierPath(roundedRect: CGRect(x: 0.0, y: 0.0, width: bounds.width, height: bounds.height), cornerRadius: radius) 
    let inside = UIBezierPath(roundedRect: CGRect(x: 3.0, y: 3.0, width: bounds.width - 6, height: bounds.height - 6), cornerRadius: radius - 3) 
    outside.append(inside) 
    outside.usesEvenOddFillRule = true 
    shapeLayer.path = outside.cgPath 
} 

init(color: UIColor?) { 
    super.init(frame: .zero) 

    let isGradient = color == nil 

    shapeLayer.fillRule = kCAFillRuleEvenOdd 
    shapeLayer.fillColor = UIColor.red.cgColor 
    layer.insertSublayer(shapeLayer, at: 0) 
    //gradient part 
    gradient.colors = isGradient ? [Constants.gradientStart, Constants.gradientEnd] : [color!.cgColor, color!.cgColor] 
    gradient.startPoint = CGPoint(x: 0.2, y: 0.5) 
    gradient.endPoint = CGPoint(x: 1, y: 1) 
} 
} 

私は自分のコードにそのグラデーションを適用するにはどうすればよいですか?

答えて

2

CAShapeLayerをビューのlayerに追加するのではなく、CAGradientLayermaskと設定します。また、グラデーションレイヤの境界を設定することも忘れないでください。

私はそれが遊び場で実行するために取得するためにいくつかの変更をしなければならなかったが、これは私の作品:

let gradientStart = UIColor.orange 
let gradientEnd = UIColor.blue 

final class BorderedButton: UIButton { 

    private let gradient = CAGradientLayer() 
    private let shapeLayer = CAShapeLayer() 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     let radius = bounds.size.height/2 
     let outside = UIBezierPath(roundedRect: CGRect(x: 0.0, y: 0.0, width: bounds.width, height: bounds.height), cornerRadius: radius) 
     let inside = UIBezierPath(roundedRect: CGRect(x: 3.0, y: 3.0, width: bounds.width - 6, height: bounds.height - 6), cornerRadius: radius - 3) 
     outside.append(inside) 
     outside.usesEvenOddFillRule = true 
     shapeLayer.path = outside.cgPath 
     gradient.frame = CGRect(x: 0, y: 0, width: bounds.size.width, height: bounds.size.height) 
    } 

    init(color: UIColor?, frame: CGRect = .zero) { 
     super.init(frame: frame) 

     let isGradient = color == nil 

     shapeLayer.fillRule = kCAFillRuleEvenOdd 

     //gradient part 
     gradient.colors = isGradient ? [gradientStart.cgColor, gradientEnd.cgColor] : [color!.cgColor, color!.cgColor] 
     gradient.startPoint = CGPoint(x: 0.2, y: 0.5) 
     gradient.endPoint = CGPoint(x: 1, y: 1) 

     gradient.mask = shapeLayer 

     layer.addSublayer(gradient) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 
+0

それは魅力のように働いている;)それは非常にきれいな答えは... –

関連する問題