Ширина UICollectionViewCell больше, чем я установил в sizeForItemAt

Ширина/высота моего UICollectionView соответствует всему доступному пространству.

Я хочу отображать две ячейки в одной строке (два столбца)

Таким образом, ширина одной ячейки должна составлять половину ширины UICollectionView (collectionView.frame.width / 2)

Поэтому я программно меняю ширину ячейки в функции UICollectionViewDelegateFlowLayout:

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

Но визуально ширина ячейки намного больше collectionView.frame.width / 2.0 (проверено на симуляторе iPhone SE)

Таким образом, он занимает больше половины ширины экрана.

Здесь я напечатал информацию о размерах:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath)
    print("didSelectItemAt \(cell.frame.width), table width: \(collectionView.frame.width), item calc width: \(collectionView.frame.width / 2)")
}

ширина ячейки didSelectItemAt 187,5, ширина таблицы: 375,0, полуширина: 187,5

введите здесь описание изображения

Почему это происходит?

Есть также проблема с полями, но сначала я должен решить эту проблему.

Обновить

Хотя он отлично работает с симулятором iPhone 6s (я отредактировал изображение, поместив два элемента в первый ряд, чтобы проверить, подходят ли они):

введите здесь описание изображения

Так что же не так с iPhone SE?

Я не хочу знать, что такая же проблема может быть и с другими iPhone или iPad.




Ответы (4)


375.0 — это размер iPhone 6s и X, а не iPhone SE, который имеет размер 320.0.

Причина в том, что существует ограничение ширины collectionView, которое было установлено в режиме iPhone 6s, но позже при переключении на симулятор SE это ограничение не было обновлено.

person E.Coms    schedule 29.03.2019
comment
хорошо, я проверю ограничение позже. Для UICollectionView я ранее установил trailing, leading, top, bottom на safe area - person user924; 29.03.2019
comment
Я использую автоматическую компоновку, я считаю, что ограничения должны работать одинаково для всех устройств. - person user924; 29.03.2019
comment
Может быть. Но вы должны перепроверить другой режим дизайна. - person E.Coms; 29.03.2019
comment
Нашел проблему. Если мы добавим контроллер просмотра коллекции в раскадровку, он будет работать нормально только для текущего выбранного устройства iPhone... Так раздражает, что мне пришлось вручную добавлять ограничения, чтобы представление коллекции соответствовало безопасной зоне любого устройства. - person user924; 12.04.2019

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

extension ViewController : UICollectionViewDelegateFlowLayout{

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

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let collectionViewWidth = collectionView.bounds.width
        return CGSize(width: collectionViewWidth/2, height: 150)
    }

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

кроме того, вы должны проверить ограничение вашего UICollectionView, если оно соответствует вашему требованию или нет.

person Dhaval Bhimani    schedule 29.03.2019

Попробуйте использовать широкое представление, а не collectionView.

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

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: (view.frame.width / 2.0) - 5, height: 150) // provide little bit space between cells
}

Надеюсь, это поможет.

person Faysal Ahmed    schedule 29.03.2019

Лучшее решение — перезагрузить представление коллекции в основном потоке с небольшой задержкой.

   DispatchQueue.main.asyncAfter(deadline: .now() + 0.10) {
       self.myCollectionView.reloadData()
   }
person Vinodsagar    schedule 30.07.2021