UICollectionView: удалить пробел между ячейками (по 7 элементов в строке) - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть UICollectionView с 7 элементами в строке (или фактически ширина каждого элемента равна collectionView.bounds.width, разделенной на 7).

Вот пример кода:

final class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    let randomColors: [UIColor] = [.red, .blue, .green, .yellow, .orange, .purple, .cyan, .gray, .darkGray, .lightGray, .magenta]

    var colors: [UIColor] {
        var result: [UIColor] = []
        for _ in 0..<200 {
            result.append(randomColors[Int(arc4random_uniform(UInt32(randomColors.count - 1)))])
        }
        return result
    }

    @IBOutlet weak var collectionView: UICollectionView!

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: collectionView.bounds.size.width / 7, height: 45)
    }

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

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

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

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return colors.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ColorCollectionViewCell", for: indexPath) as! ColorCollectionViewCell
        cell.color = colors[indexPath.row]
        return cell
    }

}


final class ColorCollectionViewCell: UICollectionViewCell {

    var color: UIColor? {
        didSet {
            self.backgroundColor = color
        }
    }

}

И раскадровка:

enter image description here

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

enter image description here

Что я могу сделать здесь?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 28 февраля 2019

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

let numColumns = 7
let availableWidth = collectionView.bounds.size.width
let minWidth = floor(availableWidth / CGFloat(numColumns))
let remainder = availableWidth - minWidth * CGFloat(numColumns)

Что теперь делать с остатком?Давайте просто добавим пиксели в ячейку слева:

let columnIndex = indexPath.row % numColumns
let cellWidth = CGFloat(columnIndex) < remainder ? minWidth + 1 : minWidth
return CGSize(width: cellWidth, height: 45)

Это просто основная идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...