【问题标题】:Gradient gets darker whenever leaving app and then coming back每当离开应用程序然后回来时,渐变会变暗
【发布时间】:2021-04-07 23:37:24
【问题描述】:

所以我在 UIView 子类的下半部分实现了一个简单的渐变,如下所示

但是,每次我离开应用程序并重新进入它时,渐变都会变暗,以此类推。我怎样才能让它保持相同的阴影?

这是我的渐变代码。我不知道将它放在 layoutSubviews 中是否正确,但我无法通过直接调用渐变代码来使其工作,例如在 viewDidLoad 中:

override func layoutSubviews() {
   let gradientLayer = CAGradientLayer()
   gradientLayer.type = .axial
   gradientLayer.colors = [UIColor.clear.cgColor, UIColor.black.cgColor]
   gradientLayer.frame = bounds
   gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
   gradientLayer.endPoint = .init(x: 0, y: 1)
   gradientLayer.zPosition = 1
   gradientLayer.opacity = 0.5
   layer.addSublayer(gradientLayer)
}

【问题讨论】:

  • 您是否在彼此之上添加多个渐变?
  • 这是因为每次创建新图层并添加子图层时都会调用布局方法。所以你需要在 awake from nib 方法中创建和添加子层,并在布局子视图方法中更新层框架。

标签: swift uikit cagradientlayer


【解决方案1】:

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, 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
        layer.addSublayer(gradientLayer)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        gradientLayer.frame = bounds
    }
}

【讨论】:

  • 我明白你在说什么。但是你会怎么做呢?我正在尝试将此添加到自定义 UIView,然后将进入单独的视图控制器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2023-03-12
  • 1970-01-01
  • 2016-09-24
相关资源
最近更新 更多