Изменить вид внутри UICollectionViewCell, когда нажата не работает - PullRequest
0 голосов
/ 27 мая 2018

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

К сожалению, пользовательский интерфейс не обновляется.Есть идеи?

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

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath as IndexPath) as! UICollectionViewCell
        // Configure the cell
        let member: UserProfile = groupMembers[indexPath.item]
        let imgAvatar = cell.viewWithTag(2) as! UIImageView

        imgAvatar.layer.cornerRadius = contactAvatar.frame.size.width / 2
        imgAvatar.clipsToBounds = true
        imgAvatar.contentMode = UIViewContentMode.scaleAspectFill
        imgAvatar.layer.borderWidth = 2.0
        imgAvatar.layer.borderColor  = UIColor.clear.cgColor
        imgAvatar.layer.cornerRadius = 30.0

        let downloadURL = NSURL(string: member.avatarUrl)!
        imgAvatar.af_setImage(withURL: downloadURL as URL)

        return cell 
    }

А теперь вот код, который выполняется при нажатии на любой данный UIImageView в коллекции, но, похоже, он не обновляет изображение:

 ///Fired when tapped on an image of a person
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

         let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath as IndexPath) as! UICollectionViewCell
        let tappedUser: UserProfile = groupMembers[indexPath.item]
        let imgAvatar = cell.viewWithTag(2) as! UIImageView

           ..add item to collection, etc.. 

           //Update imageview to indicate it's been tapped.
           DispatchQueue.main.async {
            contactAvatar.layer.cornerRadius = contactAvatar.frame.size.width / 2
            imgAvatar.clipsToBounds = true
            imgAvatar.contentMode = UIViewContentMode.scaleAspectFill
            imgAvatar.layer.borderWidth = 2.0
            imgAvatar.layer.cornerRadius = 30.0
            imgAvatar.layer.borderColor = UIcolor.blue.cgColor
            }

        }
    } 

Запустив этот код, он достигает точки останова, чтобы указать, что я нажал на элемент, но он не обновляет интерфейс.Я убежден, что существует проблема с потоком / пользовательским интерфейсом, когда представление коллекции не «перерисовывает» изменения, внесенные в изображение.Может быть, я не могу изменить внешний вид представления внутри коллекции?

Заранее спасибо за понимание.

Ответы [ 2 ]

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

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

    let cell = collectionView.cellForItem(at:indexPath) as! UICollectionViewCell
0 голосов
/ 27 мая 2018

Ваш didSelect неверен.Получите ячейку из представления коллекции. cellForItem

 ///Fired when tapped on an image of a person
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

     let cell = collectionView.cellForItem(at:indexPath) as! UICollectionViewCell
    let tappedUser: UserProfile = groupMembers[indexPath.item]
    let imgAvatar = cell.viewWithTag(2) as! UIImageView

       ..add item to collection, etc.. 

       //Update imageview to indicate it's been tapped.
       DispatchQueue.main.async {
        contactAvatar.layer.cornerRadius = contactAvatar.frame.size.width / 2
        contactAvatar.clipsToBounds = true
        contactAvatar.contentMode = UIViewContentMode.scaleAspectFill
        contactAvatar.layer.borderWidth = 2.0
        contactAvatar.layer.cornerRadius = 30.0
        contactAvatar.layer.borderColor = UIcolor.blue.cgColor
        }

    }
} 

Используя мобильный телефон, дайте мне знать, если он не работает.

...