Animate isHighlighted состояние imageView внутри ячейки представления коллекции - PullRequest
0 голосов
/ 14 декабря 2018

Я сталкиваюсь с проблемой с isHighlighted состоянием imageView внутри ячейки представления коллекции: мне не удается анимировать переход между двумя изображениями так, как я нацеливаюсь.

Каждая настраиваемая ячейкамоего представления коллекции имеет 3 вида:

  1. UIImageView : фоновое изображение с подсвеченными и не подсвеченными связанными .pngs
  2. второй UIImageView : другое изображение с подсвеченными и не подсвеченными связанными .pngs как подпредставление предыдущего UIImageView
  3. пользовательского UILabel: текстовая метка

Когда я касаюсь ячейки, оба ImageViewsмгновенно перейти в выделенное состояние, но я бы хотел, чтобы они вместо этого перешли в это состояние (простой переход CrossDissolve)

Я пробовал 2 разных подхода: переопределение метода isSelected в пользовательском классе ячеек и размещение анимации вcollectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)

Переопределение isSelected свойство :

    override var isSelected: Bool {
        didSet {
            UIView.transition(with: cellImageView, duration: 1, options: .transitionCrossDissolve, animations: {
                self.cellImageView.setNeedsLayout()
                self.cellImageView.layoutIfNeeded()
                self.cellImageView.isHighlighted = self.isSelected
            })
        }
    }

Таким образом, я не получаю анимацию, когда нажимаю на ячейку в симуляторе, либо когда ячейка выбрана, либо когда она теряет выбранное состояние, кроме случаев, когда я щелкаю и удерживаю ячейку : тогда я получаю анимацию предыдущей ячейки, теряющей свою выделенную ячейку (другими словами, у меня есть переход предыдущего выбранного изображения ViewView с isHighlighted(true) на isHighlighted(false)).

didSelectItemAt indexPath Method

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        let cell = collectionView.cellForItem(at: indexPath) as! SubMenuCell
        UIView.transition(with: cell, duration: 1.0, options: .transitionCrossDissolve, animations: 
            cell.setNeedsLayout()
            cell.layoutIfNeeded()
            cell.cellImageView.isHighlighted = cell.isSelected
        })
    }

Этот метод не запускает анимацию, когда ячейка выбрана, но обеспечивает анимацию перехода, когда ячейка перемещается от isSelected(true) до isSelected(false): другими словами,Я вижу, что предыдущая выбранная ячейка исчезает , и я не вижу выбранную ячейку , исчезающую .

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

Спасибо всем за то время, которое вы потратили на чтение и ответ!Лучшее,

Ответы [ 2 ]

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

Спасибо ребятам, что нашли время подумать над моим вопросом.Проведя дальнейшее расследование, я решил проверить, как и когда 3 события, а именно cell.isHighlighted, cell.isSelected и collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath), где сработали, и я обнаружил некоторые довольно интересные вещи на самом деле.Позвольте мне подвести итог:

Когда вы касаетесь ячейки (ячейка1) в представлении коллекции, появляются следующие события:

  1. cell1.isHightlightedустановлен на true
  2. cell1.isHightlighted установлен на false
  3. cell1.isSelected установлен на true, что вызывает cell1.isHighlighted свойство
  4. и, наконец, метод collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) называется

Теперь, когда вы касаетесь другой ячейки (ячейка2) в представлении коллекции, происходят следующие события:

  1. cell2.isHighlighted установлено на true
  2. cell1.isSelected установлено на false, что вызывает cell1.isHightlighted свойство
  3. cell2.isHighlighted установлено на false
  4. cell1.isSelected снова устанавливается на false (!)
  5. cell2.isSelected устанавливается на true, что вызывает cell2.isHighlighted свойство
  6. и снова, наконец, *Метод 1055 * называется

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

Одно решение для получения обеих анимаций (isHighlighted true и false), которое я обнаружил, заключается в том, чтобы воздействовать на наблюдателей свойств isHighlighted и isSelected моего пользовательского представления коллекцииячейка, как следует:

override var isHighlighted: Bool {
        willSet {
            if newValue == true {
                UIView.transition(with: cellImageView, duration: 1.0, options: .transitionCrossDissolve, animations: {
                    self.cellImageView.isHighlighted = newValue
                })
            }
        }
    }
    
 override var isSelected: Bool {
        willSet {
            if newValue == false {
                UIView.transition(with: cellImageView, duration: 1.0, options: .transitionCrossDissolve, animations: {
                    self.cellImageView.isHighlighted = newValue
                })
            }
        }
    }

Я надеюсь, что это поможет, и еще раз спасибо всем вам, кто потратил некоторое время, пытаясь понять это!Если кто-нибудь найдет более элегантное решение, не стесняйтесь размещать его !!!Лучшее,

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

Я не уверен, но я думаю, что вы также можете переопределить;

override func setSelected(_ highlighted: Bool, animated: Bool)

В вашем UICollectionViewCell, а также в свойстве isSelected и, следовательно, в вашем коде анимации func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath).

* Обратите внимание, что есть также разница между isHighlighted и isSelected, вы сказали isHighlighted в своем вопросе, но использовали isSelected в своей реализации.

...