方向转换后UIView中的渐变

问题描述 投票:0回答:1

我拥有UIView的扩展名以应用渐变:

    extension UIView {

    func applyGradient(colors: [CGColor]) {

        self.backgroundColor = nil
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = self.bounds // Here new gradientLayer should get actual UIView bounds
        gradientLayer.cornerRadius = self.layer.cornerRadius
        gradientLayer.colors = colors
        gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)
        gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)
        gradientLayer.masksToBounds = true

        self.layer.insertSublayer(gradientLayer, at: 0)
    }
}

在我的UIView子类中,我正在创建所有视图并设置约束:

private let btnSignIn: UIButton = {
    let btnSignIn = UIButton()

    btnSignIn.setTitle("Sing In", for: .normal)
    btnSignIn.titleLabel?.font = UIFont(name: "Avenir Medium", size: 35)

    btnSignIn.layer.cornerRadius = 30
    btnSignIn.clipsToBounds = true
    btnSignIn.translatesAutoresizingMaskIntoConstraints = false

    return btnSignIn
}()

override init(frame: CGRect) {
    super.init(frame: frame)
    addSubViews()
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    addSubViews()
}

func addSubViews() {
    self.addSubview(imageView)
    self.addSubview(btnSignIn)
    self.addSubview(signUpstackView)
    self.addSubview(textFieldsStackView)
    setConstraints()
}

我重写了layoutSubviews函数,每次更改视图边界时都会调用该函数(包括定向转换),我在其中调用applyGradient。

override func layoutSubviews() {
    super.layoutSubviews()
    btnSignIn.applyGradient(colors: [Colors.ViewTopGradient, Colors.ViewBottomGradient])
}

问题在于,由于某些原因,方向转换梯度应用错误后...

请查看屏幕截图enter image description here

我在这里想念什么?

ios swift autolayout ios-autolayout
1个回答
0
投票
@IBDesignable public class RoundedGradientButton: UIButton { static public override var layerClass: AnyClass { CAGradientLayer.self } private var gradientLayer: CAGradientLayer { layer as! CAGradientLayer } @IBInspectable var startColor: UIColor = .blue { didSet { updateColors() } } @IBInspectable var endColor: UIColor = .red { didSet { updateColors() } } override public init(frame: CGRect = .zero) { super.init(frame: frame) configure() } required public init?(coder: NSCoder) { super.init(coder: coder) configure() } override public func layoutSubviews() { super.layoutSubviews() layer.cornerRadius = min(bounds.height, bounds.width) / 2 } } private extension RoundedGradientButton { func configure() { gradientLayer.startPoint = CGPoint(x: 0, y: 0) gradientLayer.endPoint = CGPoint(x: 1, y: 1) updateColors() titleLabel?.font = UIFont(name: "Avenir Medium", size: 35) } func updateColors() { gradientLayer.colors = [startColor.cgColor, endColor.cgColor] } }

以上,我将layerClass设置为layerClass,这样操作系统就可以为我更新该层的边界。我需要做的就是确保正确更新角半径。

© www.soinside.com 2019 - 2024. All rights reserved.