Проблема с шириной границы представления изображения внутри UICollectionViewCell - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть UICollectionView.Он имеет только один раздел и несколько ячеек в этом разделе (в настоящее время 6).Внутри ячейки есть изображение (с радиусом круглого угла) и метка.Всякий раз, когда ячейка выбрана, я хочу добавить рамку вокруг изображения этой ячейки.Всякий раз, когда ячейка выбрана, вызывается «didSelectItemAt»."DidDeselectItemAt" также называется.Если ячейка видна, я могу удалить ее границу, установив для borderWidth значение 0.0.

В настоящее время в представлении коллекции одновременно отображаются только 4 ячейки.

Я делаю следующие шаги: 1. Выберите 2-ю ячейку.2. Выберите 5-ю ячейку.Ожидание: граница представления изображения 2-й ячейки должна стать 0 Фактическое поведение: обе ячейки имеют значение borderWitdth, отличное от 0.То же самое происходит и для выбора

Кроме этого, я делаю также следующее.1. Выберите первую ячейку.2. Выберите 6-ю ячейку.Ожидание: граница представления изображения 21-й ячейки должна стать равной 0. Фактическое поведение: граница обеих ячеек видна.Только после перетаскивания слишком много, значение borderWidth 1-й ячейки становится равным 0. То же самое происходит для выбора наоборот.

Ниже приведен мой код View Controller.

private var selectedCategory : Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        vibeCategoriesCollectionView.delegate = self
        vibeCategoriesCollectionView.dataSource = self
        vibeCategoriesCollectionView.register(UINib(nibName: "VibeCategoryCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "vibeCategoryCell")
        vibeCategoriesCollectionView.selectItem(at: IndexPath(row: 0, section: 0), animated: true, scrollPosition: .centeredHorizontally)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        vibeCategoriesCollectionView.layer.cornerRadius = 10
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return VibeCategories.pickerStrings.count
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width / 6, height: vibeCategoriesCollectionView.frame.height)
    }

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = vibeCategoriesCollectionView.dequeueReusableCell(withReuseIdentifier: "vibeCategoryCell", for: indexPath) as! VibeCategoryCollectionViewCell
        cell.layoutIfNeeded()
        cell.categoryName.text = VibeCategories.pickerStrings[indexPath.row]
        cell.categoryImage.image = UIImage(named: VibeCategories.categoryImages[indexPath.row])
        cell.categoryName.textColor = VibeCategories.vibeColors[indexPath.row]
        cell.categoryImage.layer.borderColor = VibeCategories.vibeColors[indexPath.row].cgColor
        if selectedCategory != indexPath.row {
            cell.categoryImage.layer.borderWidth = 0.0
        }

        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 20
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 50
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 10, left: 10, bottom: 0, right: 10)
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let currentSelectedCell = collectionView.cellForItem(at: indexPath) as! VibeCategoryCollectionViewCell
        currentSelectedCell.categoryImage.layer.borderWidth = 4.0
        selectedCategory = indexPath.row
    }

    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        let previousSelectedCell = collectionView.cellForItem(at: indexPath) as? VibeCategoryCollectionViewCell
        if previousSelectedCell != nil {
            previousSelectedCell!.categoryImage.layer.borderWidth = 0.0
        }
    }

Ниже приведен мой класс CollectionViewCellкод

class VibeCategoryCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var categoryImage: UIImageView!
    @IBOutlet weak var categoryName: UILabel!
    @IBOutlet weak var notificationLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func layoutIfNeeded() {
        super.layoutIfNeeded()

        categoryImage.layer.cornerRadius = categoryImage.frame.height / 2
        categoryImage.clipsToBounds = true
        categoryImage.layer.borderWidth = 4.0
        notificationLabel.layer.cornerRadius = notificationLabel.frame.height / 2
        notificationLabel.clipsToBounds = true
    }
}

Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 2 ]

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

Добавьте следующую строку к вашей функции cellForItemAt непосредственно перед оператором return:

cell.categoryImage.layer.borderWidth = (collectionView.indexPathsForSelectedItems ?? []).contains(indexPath) ? 4 : 0

Также переместите строку categoryImage.layer.borderWidth = 4.0 из layoutIfNeeded ячейки в функцию awakeFromNib.

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

Попробуйте это:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//      changing the current selected to not selected
        let currentSelectedIndex = IndexPath(item: selectedCategory, section: 0)
        let currentSelectedCell = collectionView.cellForItem(at: currentSelectedIndex) as! VibeCategoryCollectionViewCell
        currentSelectedCell.categoryImage.layer.borderWidth = 0.0
        self.collectionView.reloadItems(at: [currentSelectedIndex])


//      changing the new selected to selected
        selectedCategory = indexPath.row
        let newSelectedCell = vibeCategoriesCollectionView.dequeueReusableCell(withReuseIdentifier: "vibeCategoryCell", for: indexPath) as! VibeCategoryCollectionViewCell
        newSelectedCell.categoryImage.layer.borderWidth = 0.0
        self.collectionView.reloadItems(at: [indexPath])

    }
...