gpt4 book ai didi

ios - 方向转换后来自 UIView 的渐变

转载 作者:行者123 更新时间:2023-12-01 21:59:09 24 4
gpt4 key购买 nike

我有一个 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 子类中,我正在创建所有 View 并设置约束:
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 函数,每次更改 View 边界时都会调用该函数(包括方向转换),我在其中调用 applyGradient。
override func layoutSubviews() {
super.layoutSubviews()
btnSignIn.applyGradient(colors: [Colors.ViewTopGradient, Colors.ViewBottomGradient])
}

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

请看截图
enter image description here

我在这里想念什么?

最佳答案

如果您查看按钮,您会看到两个渐变。那是因为 layoutSubviews至少被调用两次,第一次是在第一次呈现 View 时,另一次是在方向改变之后。所以你至少添加了两个渐变层。

你想改变这个,所以你只有 insertSublayer一次(例如,在实例化 View 时),并且因为 layoutSubviews可以多次调用,它应该限制自己仅调整现有层,而不是添加任何层。

您也可以只使用 layerClass class 属性来使按钮的主层渐变,然后你根本不必手动调整层框架:

@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]
}
}

这种技术无需调整图层的 frame手动并产生更好的中间动画再现。

关于ios - 方向转换后来自 UIView 的渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60604845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com