TL; DR:具有2个需要CAGradientLayer的视图(顶部和底部)。意外的行为是只有“顶视图”显示渐变。底部不显示渐变。
在我们的应用程序中,我有一个视图,该视图具有在图像上看到的UICollectionView:
对于每个UICollectionViewCell,我创建了一个自定义类来进行布局细节。在UICollectionViewCell上,我有一个“ topBackground”和“ bottomBackground”,这两个视图将为每个单元格提供带有信息的标签:
@IBOutlet weak var topBackground: UIView!
@IBOutlet weak var bottomBackground: UIView!
顶视图和底视图,标签显示正确且约束起作用。
我们决定在“顶视图”和“底视图”中添加渐变效果(请参阅图像的详细信息,顶部渐变用红色标记,底部细节用黄色标记)。
对于代码,我们使用以下代码:
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
用于在滚动集合视图时避免重叠多个渐变。
结果:
我们知道底视图在其中约束起作用,因为如果我们将颜色更改为.clear
以外的颜色,它将显示另一种颜色。只是gradientLayerBottom
没有显示。
关于如何显示gradientLayerBottom
的任何想法?
答案 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)
}
}
}
输出: