Как изменить размер ячейки коллекции View - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь автоматически изменить размер ячейки представления коллекции.В iPhone 8 дизайн в порядке, но когда я пробую его на других устройствах, особенно с iPhone SE, ячейка не изменяет размеры автоматически, и часто она слишком велика или слишком мала.Я работаю с:

enter image description here

extension ViewController: UICollectionViewDataSource, UICollectionViewDelegate {

Ответы [ 5 ]

0 голосов
/ 09 октября 2018

Xcode 10 / Swift 4

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

  // Collection View Layout
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

            let screenWidth = UIScreen.main.bounds.width
            return CGSize.init(width: (screenWidth-55) / 2, height: (screenWidth-55) / 2 * 1.481)

        }
0 голосов
/ 09 октября 2018

Попробуйте, это будет работать:

Сначала вам нужно добавить делегат UICollectionViewDelegateFlowLayout, а затем использовать следующий метод делегата, он будет работать нормально для меня.

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let padding: CGFloat =  10
        let collectionViewSize = collectionView.frame.size.width - padding
        return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
    }
0 голосов
/ 09 октября 2018

Это происходит из-за несоответствия между вашим

  1. EdgeInset
  2. Расстояние между ячейками
  3. Ширина вашей ячейки

Решение: -

Добавьте делегат UICollectionViewDelegateFlowLayout, добавьте эти методы и обновите значения в соответствии с вашими требованиями, например: -

let edge    : CGFloat = 10.0
let spacing : CGFloat = 10.0

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

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let noOfColumn = 2
    let collectionviewWidth = collectionView.frame.width
    let bothEdge =  CGFloat(edge + edge) // left + right
    let excludingEdge = collectionviewWidth - bothEdge
    let cellWidthExcludingSpaces = excludingEdge - ((noOfColumn-1) * spacing)
    let finalCellWidth = cellWidthExcludingSpaces / noOfColumn
    let height = finalCellWidth
    return CGSize(width: finalCellWidth, height: height)
}
0 голосов
/ 09 октября 2018

Если то, что вы пытаетесь сделать, это

Независимо от размера экрана, я всегда хочу 2 (или, скажем, n) элементов подряд!

Тогдавам нужно UICollectionViewFlowLayout

Вы можете попробовать следующий фрагмент кода

  let itemSize = UIScreen.main.bounds.width/2 - 3

  let layout = UICollectionViewFlowLayout()
  layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0)
  layout.itemSize = CGSize(width: itemSize, height: itemSize)

  layout.minimumInteritemSpacing = 3
  layout.minimumLineSpacing = 3

  collectionView.collectionViewLayout = layout

В приведенном выше коде заменить 2 в строке:

let itemSize = UIScreen.main.bounds.width / 2 - 3

с количеством требуемых элементов в одной строке

Вы можете поместить этот код в viewDidLoad() или viewDidAppear()

0 голосов
/ 09 октября 2018

Добавить метод UICollectionViewDelegateFlowLayout

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

     return CGSize(width: value, height: value)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...