UICollectionViewCell-将不同的CAGradientLayer应用于不同的UIView

时间:2019-05-31 06:45:56

标签: ios swift uicollectionviewcell cagradientlayer

  

TL; DR:具有2个需要CAGradientLayer的视图(顶部和底部)。意外的行为是只有“顶视图”显示渐变。底部不显示渐变。

在我们的应用程序中,我有一个视图,该视图具有在图像上看到的UICollectionView:Whole device

对于每个UICollectionViewCell,我创建了一个自定义类来进行布局细节。在UICollectionViewCell上,我有一个“ topBackground”和“ bottomBackground”,这两个视图将为每个单元格提供带有信息的标签:

@IBOutlet weak var topBackground: UIView! 
@IBOutlet weak var bottomBackground: UIView!

顶视图和底视图,标签显示正确且约束起作用。

我们决定在“顶视图”和“底视图”中添加渐变效果(请参阅图像的详细信息,顶部渐变用红色标记,底部细节用黄色标记)enter image description here

对于代码,我们使用以下代码:

override func layoutSubviews() {
        if !didLayout{                
             // Top View
            let gradientLayer: CAGradientLayer = CAGradientLayer()
            gradientLayer.frame = topBackground.frame
            gradientLayer.colors =
                [UIColor.black.withAlphaComponent(0.5).cgColor, UIColor.black.withAlphaComponent(0).cgColor]
            gradientLayer.startPoint = CGPoint(x: 0.5, y: 0)
            gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.9)
            topBackground.layer.insertSublayer(gradientLayer, at: 0)
            topBackground.backgroundColor = .clear
            topBackground.alpha = 0.5

            // Bottom View
            let gradientLayerBottom: CAGradientLayer = CAGradientLayer()
            gradientLayerBottom.frame = bottomBackground.frame
            gradientLayerBottom.colors =
                [UIColor.black.withAlphaComponent(0.5).cgColor, UIColor.black.withAlphaComponent(0).cgColor]
            gradientLayerBottom.startPoint = CGPoint(x: 0.5, y: 0.9)
            gradientLayerBottom.endPoint = CGPoint(x: 0.5, y: 0)
            bottomBackground.layer.insertSublayer(gradientLayerBottom, at: 0)
            bottomBackground.backgroundColor = .clear
            bottomBackground.alpha = 0.5

            didLayout = true
        } else {
            print("already performed layout")
        }
    }

变量didLayout用于在滚动集合视图时避免重叠多个渐变。

结果:

  1. 顶视图显示渐变(预期)。
  2. 底视图未显示渐变(意外)。

我们知道底视图在其中约束起作用,因为如果我们将颜色更改为.clear以外的颜色,它将显示另一种颜色。只是gradientLayerBottom没有显示。

关于如何显示gradientLayerBottom的任何想法?

1 个答案:

答案 0 :(得分:1)

尝试一下

extension UIView{
    func setGradientBackgroundImage(colorTop: UIColor, colorBottom: UIColor) {
        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = [colorTop.cgColor, colorBottom.cgColor]
        gradientLayer.frame = bounds
        layer.insertSublayer(gradientLayer, at: 0)
    }
}

放入 UICollectionViewCell

class CollVwCell : UICollectionViewCell{

    @IBOutlet weak var VwTop: UIView!
    @IBOutlet weak var VwBottom: UIView!

    override func awakeFromNib() {
        super.awakeFromNib()
        DispatchQueue.main.async {
            self.VwTop.setGradientBackgroundImage(colorTop: UIColor.red, colorBottom: UIColor.white)
            self.VwBottom.setGradientBackgroundImage(colorTop: UIColor.white, colorBottom: UIColor.purple)
        }
    }
}

输出:

enter image description here