iOS 渐变色边框的View

312 阅读1分钟
class GradientBorderView : UIView{

    var isSelected : Bool {

        didSet{

            if isSelected{

                self.gradientLayer.removeFromSuperlayer()

                self.normalLayer.removeFromSuperlayer()

                self.layer.addSublayer(self.gradientLayer)

                self.backgroundColor = UIColor(hexString: "#EBEDF2")

            }else{

                self.gradientLayer.removeFromSuperlayer()

                self.normalLayer.removeFromSuperlayer()

                self.layer.addSublayer(self.normalLayer)

                self.backgroundColor = .white

            }

        }

    }

    var gradientLayer : CAGradientLayer

    var shapeLayer = CAShapeLayer()

    var normalShapeLayer = CAShapeLayer()

    var normalLayer = CALayer()

     init(isSelected:Bool,gradientLayer:CAGradientLayer) {

        self.isSelected = isSelected

        self.gradientLayer = gradientLayer

        super.init(frame: .zero)

         self.layer.cornerRadius = 4

         

         self.normalLayer.backgroundColor = UIColor(hexString: "#979797")?.cgColor

  


         

         self.normalShapeLayer.fillColor = nil

         self.normalShapeLayer.strokeColor = UIColor.black.cgColor

         self.normalShapeLayer.cornerRadius = 4

         self.normalShapeLayer.lineWidth = 0.5

         

         self.gradientLayer.cornerRadius = 4

         self.shapeLayer.lineWidth = 2 // 设置边框宽度

         self.shapeLayer.cornerRadius = 4

         self.shapeLayer.fillColor = nil

         self.shapeLayer.strokeColor = UIColor.black.cgColor

  


  

        

  


  


         self.gradientLayer.mask = self.shapeLayer

         self.normalLayer.mask = self.normalShapeLayer

         

  


         self.layer.addSublayer(self.gradientLayer)

    }

    override func layoutSubviews() {

        super.layoutSubviews()

        self.gradientLayer.frame = CGRectMake(-2, -2, self.bounds.width + 4, self.bounds.height + 4)

        self.normalLayer.frame = self.gradientLayer.frame

        let innerBounds = self.gradientLayer.bounds.insetBy(dx: 2, dy: 2)

        let innerPath = UIBezierPath(roundedRect: innerBounds, cornerRadius: 4)

        self.shapeLayer.path = innerPath.cgPath

        self.normalShapeLayer.path = innerPath.cgPath

    }

    

    required init?(coder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

}

支持通过selected属性控制渐变色是否展示

但如果单独设置view的背景为渐变色,实现起来就比较简单

class GradientView: UIView {

    // 1. 创建 CAGradientLayer

    var  gradientLayer : CALayer

    

    init(gradientLayer: CALayer) {

        self.gradientLayer = gradientLayer

        super.init(frame: .zero)

        setupGradient()

    }

    required init?(coder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

  


    private func setupGradient() {

        // 4. 添加渐变层到 UIView 的 layer 层次结构的最底部

        layer.insertSublayer(gradientLayer, at: 0)

    }

    

    // 5. 更新 CAGradientLayer 的尺寸以匹配 UIView 的尺寸

    override func layoutSubviews() {

        super.layoutSubviews()

        gradientLayer.frame = bounds

    }

}

像button这种也比较简单

class GradientButtonPro: UIButton {

    override func layoutSubviews() {

        super.layoutSubviews()

        updateGradientLayer()

    }

 

    private func updateGradientLayer() {

        let gradientLayer = CAGradientLayer()

        gradientLayer.frame = bounds

        gradientLayer.colors = [            UIColor(hexString: "#00CDFF")!.cgColor,            UIColor(hexString: "#4872EC")!.cgColor        ]

        gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)

        gradientLayer.endPoint = CGPoint(x: 0.0, y: 1.0)

        gradientLayer.cornerRadius = 2

        layer.insertSublayer(gradientLayer, at: 0)

    }

}