【问题标题】:Update Gradient in UICollectionViewCell更新 UICollectionViewCell 中的渐变
【发布时间】:2019-05-10 15:18:55
【问题描述】:

我有一个带有渐变的图像和按钮的 UICollectionViewCell。当我滚动时 - 我有一个错误:渐变是在图像上使用新图层绘制的,并且按钮中的文本消失了。当我向后滚动时会发生这种情况。我想我应该使用override func prepareForReuse()。但我不知道该怎么做。`也许有人可以编写代码来修复这个错误,因为我不知道该怎么做。

import UIKit

class TrainingProgramCollectionViewCell: UICollectionViewCell {



private var gradient = CAGradientLayer()
@IBOutlet weak var bgView: UIView!

@IBOutlet weak var buttonOutlet: UIButton!


@IBOutlet weak var featuredImageView: UIImageView!

@IBOutlet weak var descriptionLabel: UILabel!
@IBOutlet weak var titleLabel: UILabel!

var trainingPrograms: TrainingProgram? {
    didSet {
        self.updateUI()
    }
}



private func updateUI()
{
    if let trainingProgram = trainingPrograms {
        featuredImageView.image = trainingPrograms!.featuredImage
        titleLabel.text = trainingPrograms!.title
        descriptionLabel.text = trainingPrograms!.description
       // bgView.layer.cornerRadius = 10
      // buttonOutlet.backgroundColor = UIColor(red: 21/255, green: 126/255, blue: 238/255, alpha: 1)
        buttonOutlet.setGradientBackground(colorOne: UIColor(red: 0, green: 0.52, blue: 1, alpha: 1), colorTwo:  UIColor(red: 0, green: 0.39, blue: 0.81, alpha: 1), cornerRadius: 25)
        buttonOutlet.layer.cornerRadius = 25
        buttonOutlet.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4).cgColor
        buttonOutlet.layer.shadowOffset = CGSize(width: 0, height: 5)
        buttonOutlet.layer.shadowRadius = 15
        buttonOutlet.layer.shadowOpacity = 1
        bgView!.layer.cornerRadius = 20



        featuredImageView.contentMode = .scaleAspectFill

        let view = UIView(frame: featuredImageView.frame)
        view.clipsToBounds = true


       // view.contentMode = .scaleAspectFill
        featuredImageView.clipsToBounds = true

        let gradient = CAGradientLayer()
        gradient.frame = view.frame

        gradient.colors = [UIColor(red: 0, green: 0.48, blue: 1, alpha: 0).cgColor,UIColor(red: 0, green: 0.48, blue: 1, alpha: 1).cgColor]
        gradient.locations = [0.1, 1.0]
        view.layer.insertSublayer(gradient, at: 0)
        featuredImageView.addSubview(view)
        featuredImageView.bringSubviewToFront(view)





    } else {
        featuredImageView.image = nil
        titleLabel.text = nil
        descriptionLabel.text = nil
    }


}

override func layoutSubviews() {
    super.layoutSubviews()

    self.layer.cornerRadius = 3.0
    layer.shadowRadius = 10
    layer.shadowOpacity = 0.2
    layer.shadowOffset = CGSize(width: 5, height: 10)

    self.clipsToBounds = false
}

override func prepareForReuse() {
    super.prepareForReuse()





}

}

为按钮设置渐变

extension UIView {

func setGradientBackground(colorOne: UIColor, colorTwo: UIColor, cornerRadius: CGFloat) {

    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = self.bounds
    gradientLayer.colors = [colorOne.cgColor, colorTwo.cgColor]
    gradientLayer.locations = [0.0, 1.0]
    gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)
    gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)
    gradientLayer.cornerRadius = cornerRadius

    layer.insertSublayer(gradientLayer, at: 0)
}

【问题讨论】:

    标签: ios swift xcode uicollectionview uicollectionviewcell


    【解决方案1】:

    每次调用UpdateUI() 函数时,都会使用let gradient = CAGradientLayer() 创建新层并将其作为第一个子层添加到父层 view.layer.insertSublayer(gradient, at: 0)

    看起来你应该在单元格中有这个层的参考并且只更新参数

    【讨论】:

    • 谢谢,但是如何正确地对照片应用渐变并不断更新呢?你能写代码吗?这是我的第一次体验,我不知道该怎么做。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多