Градиент продолжает переключаться между ячейками в представлении коллекции в быстром - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть градиентный фон для моей ячейки представления коллекции, и каждый градиент отличается в зависимости от того, какой тег является ячейкой (например, Рождество - фиолетовый градиент, день рождения - зеленый градиент), однако при прокрутке представления коллекции градиенты сохраняются.на смену клеток.Есть ли способ исправить это?

это код, который я использую, чтобы установить градиент для фона.это в cellForItemAt

cell.mainView.setGradientBackground(colours: self.getColourFromTag(tag: self.lists[indexPath.item].tag))

.setGradientBackground - расширение UIView, которое просто устанавливает градиент для фона.показано здесь:

func setGradientBackground(colours: [CGColor]) {

    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = bounds
    gradientLayer.colors = colours
    gradientLayer.locations = [0.0, 1.0]
    gradientLayer.startPoint = CGPoint(x: 1.0, y: 1.0)
    gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)
    layer.insertSublayer(gradientLayer, at: 0)
}

Я использую метод ниже, чтобы получить, какие цвета в градиенте

func getColourFromTag(tag: String) -> [CGColor] {

    if tag == "Christmas" {

        return [Colours.gradients.festive.start.cgColor, Colours.gradients.festive.end.cgColor]

    }else if tag == "Birthday" {

        return [Colours.gradients.lime.start.cgColor, Colours.gradients.lime.end.cgColor]

    }else if tag == "Valentines Day" {

        return [Colours.gradients.strawberry.start.cgColor, Colours.gradients.strawberry.end.cgColor]

    }else if tag == "Charity" {

        return [Colours.gradients.blueberry.start.cgColor, Colours.gradients.blueberry.end.cgColor]

    }else if tag == "Event" {

        return [Colours.gradients.fire.start.cgColor, Colours.gradients.fire.end.cgColor]

    }else{
        return [Colours.gradients.midnight.start.cgColor, Colours.gradients.midnight.end.cgColor]
    }
}

Я попытался добавить каждый [цвет] в массив, а затем поместить его в.setGradientBackground в indexPath.item примерно так:

var colours = [[CGColor]]()

colours[indexPath.item] = self.getColourFromTag(tag: self.lists[indexPath.item].tag)
cell.mainView.setGradientBackground(colours: colours[indexPath.item])

, однако, это не работает, так как находится вне диапазона.у кого-нибудь есть решение?спасибо.

1 Ответ

0 голосов
/ 03 декабря 2018

Читая ваш код в setGradientBackground(), вы всегда инициируете новый CAGradientLayer и вставляете его в самую низкую позицию в своей ячейке.Каждый раз, когда setGradientBackground() вызывается снова, новый градиентный слой будет располагаться ниже всех других градиентов, которые вы уже вставили.

Попробуйте получить уже существующий CAGradientLayer из подслоев и установить новые цвета.

    var gradientLayer = CAGradientLayer()
    if let sublayers = layer.sublayers {
        for sublayer in sublayers {
            if let gLayer = sublayer as? CAGradientLayer {
                gradientLayer = gLayer
                break
            }
        }
    }
    gradientLayer.frame = bounds
    gradientLayer.colors = colours
    gradientLayer.locations = [0.0, 1.0]
    gradientLayer.startPoint = CGPoint(x: 1.0, y: 1.0)
    gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)
    layer.insertSublayer(gradientLayer, at: 0)

РЕДАКТИРОВАТЬ

Это более быстрая версия (Swift 4.2), использующая compactMap() для получения первого существующего градиентного слоя в layer.sublayers:

if let existingLayer = (layer.sublayers?.compactMap { $0 as? CAGradientLayer })?.first {
    gradientLayer = existingLayer
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...