2017-11-24 8 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

보기의 layerCAShapeLayer을 추가하지 말고 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

)는 아주 예쁜 대답은 ... –