Последняя строка сетки коллекции выглядит по-разному, несмотря на одинаковую ширину - быстрый iOS - PullRequest
5 голосов
/ 08 мая 2019

У меня есть фиксированная сетка ячеек представления коллекции (UICollectionView), но ячейки в нижнем ряду всегда появляются с немного меньшей шириной на экране. Размер кадра (или границы) и расчетная ширина, используемые в collectionViewLayout: UICollectionViewLayout sizeForItemAt, одинаковы для всех строк.

enter image description here

        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
    let settings = currentContents[indexPath.item]
    let height = CGFloat(30)

    // https://stackoverflow.com/questions/54915227/uicollectionview-remove-space-between-cells-with-7-items-per-row
    var cellWidth = CGFloat()
    let availableWidth = collectionView.bounds.size.width
    print("available width", availableWidth)
    let minimumWidth = floor(availableWidth / collectionContents.cellsPerRow5)
    print("minmum width", minimumWidth)
    cellWidth = minimumWidth * settings.portion - 1
    print("cell width", cellWidth)

    return CGSize(width: cellWidth, height: height)
}

enter image description here

Я бы хотел, чтобы нижняя строка совпадала с другими строками, но не могу представить, что происходит, когда изменяется ширина после возврата значения в методе делегата макета (или как это исправить).

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

UIKit не любит значения с более чем двумя десятичными знаками, округляет их или сделает это за вас.

Здесь UICollectionViewFlowLayout округляет размер ячейки и начинает заполнять строки знаком "interitemspacing ", по крайней мере, равен указанному вами minimumInteritemSpacing.В последней строке он использовал в точности значение minimumInteritemSpacing и не полностью заполняет строку.

Исправьте его, используя лучшие округленные значения, создавая иллюзию, что все идеально выровнено.

Я обычно использую эти расширения:

extension CGFloat {
    func xx_rounded(_ rule: FloatingPointRoundingRule = .down, toDecimals decimals: Int = 2) -> CGFloat {
        let multiplier = CGFloat(pow(10.0, CGFloat(decimals))
        return (self * multiplier).rounded(.down) / multiplier
    }
}

extension CGSize {
    func xx_rounded(rule: FloatingPointRoundingRule = .down, toDecimals: Int = 2) -> CGSize {
        return CGSize(
            width: width.xx_rounded(rule, toDecimals: toDecimals),
            height: height.xx_rounded(rule, toDecimals: toDecimals)
        )
    }
}

Изменение:

return CGSize(width: cellWidth, height: height)

на

return CGSize(width: cellWidth, height: height).xx_rounded()
0 голосов
/ 14 мая 2019

Просто замените

cellWidth = (minimumWidth * settings.portion) - 0.5

С

cellWidth = (minimumWidth * settings.portion)

Указано minimumInteritemSpacingForSectionAt до 0,5 вместо 0

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

CVTVCell.swift

Просто перезагрузите ваш метод UICollectionView in awakeFromNib после того, как ваш набор данных в currentContents.Пожалуйста, обратитесь к образцу кода ниже.

override func awakeFromNib(){
    super.awakeFromNib()
    currentContents = collectionContents.allEndings[0]
    self.cView.reloadData()
}

Загрузите код отсюда

...