问题描述
所以我在 UIView 子类的下半部分实现了一个简单的渐变,如下所示
但是,每次我离开应用程序并重新进入它时,渐变都会变暗,依此类推。我如何使它保持相同的阴影?
这是我的渐变代码。我不知道将它放在 layoutSubviews 中是否正确,但是我无法仅通过直接调用渐变代码来使其工作,例如在 viewDidLoad 中:
classmethod
解决方法
layoutSubviews()
被多次调用,因此您的渐变被重复添加。
layoutSubviews()
并不是真正添加此渐变的地方。在 viewDidLoad()
中添加它对您不起作用的原因是视图的 bounds
尚未建立。继续在 viewDidLoad()
中设置渐变。保留 gradient
作为属性,并使用 viewDidLayoutSubviews()
更新框架。
class ViewController: UIViewController {
let gradientLayer = CAGradientLayer()
override func viewDidLoad() {
super.viewDidLoad()
gradientLayer.type = .axial
gradientLayer.colors = [UIColor.clear.cgColor,UIColor.black.cgColor]
gradientLayer.startPoint = CGPoint(x: 0,y: 0.5)
gradientLayer.endPoint = .init(x: 0,y: 1)
gradientLayer.zPosition = 1
gradientLayer.opacity = 0.5
view.layer.addSublayer(gradientLayer)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
gradientLayer.frame = view.bounds
}
}
对于作为 UIView
子类的视图,您可以这样处理:
class MyView: UIView {
let gradientLayer = CAGradientLayer()
override init(frame: CGRect) {
super.init(frame: frame)
addGradient()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
addGradient()
}
func addGradient() {
gradientLayer.type = .axial
gradientLayer.colors = [UIColor.clear.cgColor,y: 1)
gradientLayer.zPosition = 1
gradientLayer.opacity = 0.5
layer.addSublayer(gradientLayer)
}
override func layoutSubviews() {
super.layoutSubviews()
gradientLayer.frame = bounds
}
}