UICollectionViewCell альфа не меняется при использовании .reloadItems - PullRequest
0 голосов
/ 03 января 2019

Я использовал UICollectionView.reloadData() для обновления своих ячеек на лету, и это сработало отлично, хотя, это делает анимацию чрезвычайно неуклюжей.Я подключаюсь к func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell и выполняю логику для определения пользовательского интерфейса ячеек.

Вот этот код методов:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "RepCollectionViewCell", for: indexPath) as! RepCollectionViewCell

        let mask = CAShapeLayer()
        let path = UIBezierPath(arcCenter: CGPoint(x: cell.bounds.midX, y: cell.bounds.midY),
                                radius: cell.bounds.width / 2, startAngle: -CGFloat.pi / 2, endAngle: 2 * .pi, clockwise: true)

        path.close()

        mask.frame = cell.bounds
        mask.path = path.cgPath

        var alpha = 1.0
        var color = UIColor.white
        var size = 0.0

        switch reps[indexPath.row] {
        case currentRep + 3:
            size = FONT_SIZE / 4
        case currentRep + 2:
            size = FONT_SIZE / 3
        case currentRep + 1:
            size = FONT_SIZE / 2
        case currentRep:
            color = .green
            size = FONT_SIZE
        case currentRep - 1:
            size = FONT_SIZE / 2
            alpha = 0.75
        case currentRep - 2:
            size = FONT_SIZE / 3
            alpha = 0.50
        case currentRep - 3:
            size = FONT_SIZE / 4
            alpha = 0.25
        default:
            color = .clear
            alpha = 0
        }

        cell.layer.mask = mask
        cell.repCount.text = String(reps[indexPath.row])
        cell.backgroundColor = color
        cell.repCount.font = UIFont(name: FONT_NAME, size: CGFloat(size))
        cell.alpha = CGFloat(alpha)

        return cell
    }

Теперь, как уже упоминалось, альфа устанавливается правильно при использовании UICollectionView.reloadData(), но, когда я использую метод UICollectionView.reloadItems(at: [IndexPaths]) и передаю массив indexPaths, альфа-ячейка не обновляется.Тем не менее, цвет фона, размер шрифта, альфа-содержимого contentView и т. Д ... будет обновляться.

Вот код, который я использую для генерации indexPath ячеек, которые должны быть обновлены, и последующего вызова.

private func focusCollectionView()
    {
        self.MyUICollectionView.reloadItems(at: generateIndexPaths())
        self.MyUICollectionView.scrollToItem(at: IndexPath(item: myVar - 1, section: 0), at: UICollectionView.ScrollPosition.centeredHorizontally, animated: true)
    }

    private func generateIndexPaths() -> [IndexPath]
    {
        var indexPaths = [IndexPath]()

        if(myVar - 4 >= 0)
        {
            indexPaths.append(IndexPath(row: myVar - 4, section: 0))
        }
        if(myVar - 3 >= 0)
        {
            indexPaths.append(IndexPath(row: myVar - 3, section: 0))
        }
        if(myVar - 2 >= 0)
        {
            indexPaths.append(IndexPath(row: myVar - 2, section: 0))
        }
        if(myVar - 1 >= 0)
        {
            indexPaths.append(IndexPath(row: myVar - 1, section: 0))
        }

        indexPaths.append(IndexPath(row: myVar, section: 0))

        if(myVar + 1 < _myOtherVar)
        {
            indexPaths.append(IndexPath(row: myVar + 1, section: 0))
        }
        if(myVar + 2 < _myOtherVar)
        {
            indexPaths.append(IndexPath(row: myVar + 2, section: 0))
        }
        if(myVar + 3 < _myOtherVar)
        {
            indexPaths.append(IndexPath(row: myVar + 3, section: 0))
        }

        return indexPaths
    }

Вот демонстрация двух результатов, первыйиспользуя 'reloadData', а второй с помощью 'reloadItems': https://imgur.com/a/ECOnYIj

Я не знаю, почему это происходит и что делать, чтобы это исправить, какие-либо идеи?

1 Ответ

0 голосов
/ 07 января 2019

Насколько я понял цвет фона должен просвечивать? Или я неправильно понял намерение?

Так что тестирование с вашим кодом кажется, что альфа для ячейки не применяется, см.

view

Идея

Если задать для backgroundColor ячейки значение .clear, мы сможем использовать альфа-канал contentView, и мы все равно сможем видеть фон до конца.

Чтобы проверить это

В подклассе UICollectionViewController я использовал:

self.collectionView.backgroundColor = .black

Я немного изменил ваш код здесь (как предложил rmaddy в своем ответе):

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
...
cell.myLabel.text = String(reps[indexPath.row])
cell.contentView.alpha = 1
...

Затем меняли каждый

  • cell.backgroundColor = до cell.contentView.backgroundColor =

  • cell.alpha = до cell.contentView.alpha =

В MyUICollectionViewCell я установил backgroundColor ячейки в UIColor.clear:

self.backgroundColor = .clear

Кроме того, код для CollectionViewCell довольно неинтересен, вот только для справки:

class MyUICollectionViewCell: UICollectionViewCell {

    let myLabel = UILabel()

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = .clear
        self.contentView.addSubview(self.myLabel)
        self.myLabel.textAlignment = .center
        self.myLabel.snp.makeConstraints { (maker) in
            maker.edges.equalToSuperview()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

В моем тестовом примере myVar - это индекс выбранного элемента, поэтому я удалил -1 в scrollToItem, чтобы он выглядел так:

private func focusCollectionView()
{
    self.collectionView.reloadItems(at: generateIndexPaths())
    self.collectionView.scrollToItem(
        at: IndexPath(item: myVar, section: 0),
        at: .centeredHorizontally,
        animated: true)
}

Демо

Так что при тестировании в симуляторе это выглядит так:

Testing in Simulator

Это то, что вы искали?

...