UICollectionViewCell, множественный размер ячейки, установить ширину градиента просмотра, не установленную в текущий размер ячейки, и иногда изменяется при прокрутке - PullRequest
0 голосов
/ 05 июля 2018

У меня есть 2 размера для ячеек в этом классе, и это доставило мне массу неприятностей, так как я должен установить нижнюю градиентную видимость для ячейки. Когда я впервые открываю viewController, все настраивается правильно, за исключением того, что иногда цвета градиентного вида не выглядят одинаково в некоторых ячейках, но настоящая проблема начинается, когда вы начинаете прокрутку, нижний градиентный вид разрезается пополам в больших ячейках и Градиент цвета очень запутался, как вы видите на изображении ниже, некоторые имеют очень темный цвет в качестве нижнего, а некоторые вместо этого имеют желтоватый цвет, из-за чего клетки не выглядят одинаково

Как настроить размер ячейки:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SearchProductsCell", for: indexPath) as! SearchProductsCell
    cell.configCell(data: data[indexPath.row])
    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let smallCellSize : CGFloat =  self.collectionView.frame.height  / 2.11
    let height = indexPath.row % 3 == 0 ? self.collectionView.frame.height  : smallCellSize
     return CGSize(width: height, height: height)
}

и это настройка класса ячейки:

 class SearchProductsCell: UICollectionViewCell {

@IBOutlet weak var imageV: UIImageView!
@IBOutlet weak var titleLbl: UILabel!
@IBOutlet weak var gradientView: UIView!

var isGradientAdded = false

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func prepareForReuse() {
    super.prepareForReuse()
}


func configCell(data : Product_Data ) {

    let img = data.image == "" ? data.thumb : data.image
    imageV.setupApiImage(imagePath: img)
    titleLbl.text = data.name
    if isGradientAdded == false {
        addGradient()
        isGradientAdded = true
    }
}

func addGradient () {
    let gradient = CAGradientLayer()
    gradient.frame = self.bounds
    let topColor = UIColor.yellow
    let botomColor = UIColor.red
    gradient.colors = [topColor.cgColor, botomColor.cgColor]
    gradientView.layer.insertSublayer(gradient, at: 0)
} 

    }

enter image description here

1 Ответ

0 голосов
/ 05 июля 2018

Из-за повторного использования ячейки ваш gradient frame устареет при каждом изменении геометрии ячейки.

В вашем SearchProductsCell классе обновите frame вашего gradient в override из layoutSubviews:

override func layoutSubviews() {
    super.layoutSubviews()
    if isGradientAdded {
        gradientView.layer.sublayers?.first?.frame = self.bounds
    }
}
...