цвета строки представления коллекции изменяются при прокрутке - PullRequest
0 голосов
/ 06 мая 2018

У меня есть это представление коллекции, и я установил цвет его строк при рисовании каждой строки на основе ее индекса.Он показывает правильный цвет для каждой строки, пока вы не прокрутите вниз, а затем снова поднимитесь.Например, если это было в порядке R, G, B, R, G, B при прокрутке немного вверх и вниз, это может быть G, G, R, B, R, B.Я попытался установить растеризованный слой на true и false, но мне тоже не повезло.Я не понимаю, почему это происходит и как это исправить.Поскольку я установил цвет в функции cellForItemAt, он должен вызываться при каждом повторном рисовании строки и создании цвета строки на основе списка цветов и идентификатора этой строки, поэтому он всегда должен рисовать одно и то же.

Вот частьмоего кода.

class MyCollectionViewController: UICollectionViewController {
//MARK: Properties

var list = [Item]()
var colors = [[String]]()

override func viewDidLoad() {
    super.viewDidLoad()
    self.refreshList(self)
    colors.append(["#ff3e99","#ffa35a"])
    colors.append(["#668dff","#ff53ff"])
    colors.append(["#6ae0d7","#00d3ad"])
}    

override func numberOfSections(in tableView: UICollectionView) -> Int {
    return 1
}

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return list.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    // Table view cells are reused and should be dequeued using a cell identifier.
    let cellIdentifier = "xxxx"

    guard let cell = self.collectionView?.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as? xxxxCell  else {
        fatalError("The dequeued cell is not an instance of xxxx.")
    }
    // Fetches the appropriate meal for the data source layout.
    let item = list[indexPath.row]
    style(cell: cell.rootView, index: item.id!)

    return cell
}

func style(cell:LGButton, index: Int) {
    cell.gradientStartColor = UIColor(hexString: colors[index % colors.count][0])
    cell.gradientEndColor = UIColor(hexString: colors[index % colors.count][1])
    cell.shadowColor = UIColor(hexString: colors[index % colors.count][0])
    cell.shadowRadius = 8
    cell.shadowOpacity = 0.8
}

}

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Я не использовал LGButton, но смотрю на https://github.com/loregr/LGButton/blob/develop/LGButton/Classes/LGButton.swift,, предполагая, что это код, который вы используете, после установки градиента вы не можете его изменить. Поэтому, когда ваши ячейки используются повторно, даже если вы пытаетесь сбросить цвета градиента в вашей функции style, код LGButton не учитывает изменение.

В приведенной выше ссылке в строке 398 (на момент написания этой статьи) первая строка функции setupGradientBackground проверяет, равна ли переменная gradient нулю, если это так, она устанавливает gradient, что означает, что она не будет изменить позже при обновлении начального и конечного цветов градиента. Я думаю, что это недостаток в LGButton - когда вы меняете значение начального или конечного цветов, он должен пересчитать градиент.

Мне кажется, вы можете установить градиент на ноль, чтобы вызвать пересчет. Возможно, вам нужно установить все значения на ноль, чтобы градиент не сбрасывался до того, как вы закончили установку всех своих значений.

В приведенном ниже фрагменте я также переименую параметр ячейки в button, чтобы его вызов не вводил в заблуждение - похоже, что вы передаете ячейку, а не кнопку.

func style(button:LGButton, index: Int) {
    button.gradientStartColor = nil
    button.gradientEndColor = nil
    button.gradient?.removeFromSuperLayer()
    button.gradient = nil
    button.gradientStartColor = UIColor(hexString: colors[index % colors.count][0])
    button.gradientEndColor = UIColor(hexString: colors[index % colors.count][1])
    button.shadowColor = UIColor(hexString: colors[index % colors.count][0])
    button.shadowRadius = 8
    button.shadowOpacity = 0.8
}
0 голосов
/ 06 мая 2018

Проблемы при прокрутке заставляют меня думать, что это проблема повторного использования ячейки. Попробуйте внедрить prepareForReuse внутри своего xxxxCell UICollectionViewCell. Сбросьте свойства и посмотрите, поможет ли это.

Что-то вроде:

override func prepareForReuse() {
    super.prepareForReuse()
    gradientStartColor = UIColor.clear
    gradientEndColor = UIColor.clear
    shadowColor = UIColor.clear
}
...