在Collection View单元格中的UIView上设置渐变背景

时间:2019-10-26 16:18:25

标签: ios swift uicollectionview uicollectionviewcell

我有一个UICollectionViewCell,其中包含一个我要设置渐变背景的UIView。这是我的cellForItemAt方法:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if let cell: PaymentMethodCVCell = collectionView.dequeueReusableCell(withReuseIdentifier: "paymentMethodCVCell", for: indexPath) as? PaymentMethodCVCell {
           let row = indexPath.row
           cell.rewardsCard.setGradientBackground(colorTop: appRed, colorBottom: appRed.darkerColor(), withCornerRadius: 10)
           return cell
    }

    return UICollectionViewCell()
}

其中setGradientBackground被定义为UIView的扩展名:

func setGradientBackground(colorTop: UIColor, colorBottom: UIColor, withCornerRadius : CGFloat){
        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = [colorBottom.cgColor, colorTop.cgColor]
        gradientLayer.startPoint = CGPoint(x: 0.5, y: 1.0)
        gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.0)
        gradientLayer.locations = [0, 1]
        gradientLayer.frame = bounds
        gradientLayer.cornerRadius = withCornerRadius
        layer.insertSublayer(gradientLayer, at: 0)
}

这很好,但是只有当我在UICollectionView中向上滚动和向下滚动并且重新加载了单元格时-最初加载到页面上的单元格没有正确设置背景。在UICollectionViewCell本身中执行此操作也不起作用。

1 个答案:

答案 0 :(得分:1)

bounds内部尚不了解视图cellForRowAt,并且当单元格出队时滚动时会添加许多渐变

gradientLayer.frame = bounds

所以在单元格内

var once = true

override func layoutSubviews() {
   super.layoutSubviews()
    if once {
        // add gradient
        once = false
    }
 } 

OR

override func layoutSubviews() {
   super.layoutSubviews()
    if !(rewardsCard.layer.sublayers?.first is CAGradientLayer ) {
        // add gradient 
    }
 }