Подтвердить что ты не робот

UICollectionView 3 столбчатая сетка, 1px пробел??? (изображение включено)

Я установил UICollectionView с FlowLayout, который не оставляет места между ячейками в вертикальном или горизонтальном направлениях.

У меня все работает, но между 2-м и 3-м столбцами есть нечетное 1px-пространство, и я понятия не имею, почему!? Я проверил, что разрыв 1px появляется как в iOS-симуляторе, так и на реальном устройстве. Кто-нибудь испытал это?

Мой UIViewController является делегатом/источником данных следующего вида:

class MyViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout

Я выполнил необходимые функции для удаления любого интервала (и проверены с помощью операторов печати, которые они запускают), а также визуальное подтверждение ячеек, расположенных рядом друг с другом:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
    return UIEdgeInsetsZero
}

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

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

Наконец, я распечатал ширину возвращаемой ячейки (каждый квадрат цвета), чтобы убедиться, что она была (view.frame.width / 3) или (320/3), которая равна 106.666667

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

    var totalHeight: CGFloat = (self.view.frame.width / 3)
    var totalWidth: CGFloat = (self.view.frame.width / 3)

    println(totalWidth) // this prints 106.666666667

    return CGSizeMake(totalWidth, totalHeight)
}

enter image description here

4b9b3361

Ответ 1

Лучше избегать двойного числа в аналогичных ситуациях. Использование:

return CGSizeMake(ceil(totalWidth), ceil(totalHeight))

Ответ 2

У меня была та же проблема, я исправил ее с помощью кода ниже:

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

    let paddingSpace = sectionInsets.left * 4
    let availableWidth = view.frame.width - paddingspace
    let widthPerItem  = availableWidth/3

    return CGSizeMake(width: widthPerItem, height: widthPerItem)
}

и определите переменную ниже в начале вашего класса:

fileprivate let sectionInsets = UIEdgeInsets(top: 0.0, left: 0.5, bottom: 0.0, right: 0.0)

Ответ 3

Вот мое решение для выпуска просто сделать среднюю ячейку шириной 106 и другие две с шириной 107 в методе collectionView layout

NSInteger numColumns = 3;
CGSize deviceSize;
CGFloat width = self.view.frame.size.width / numColumns;
CGFloat height = width ;
NSInteger rem = (int)self.view.frame.size.width%numColumns; 
if(indexPath.row == (1 + numColumns*counter) && rem != 0) {  

    deviceSize = CGSizeMake(floor (width), ceil(height));
    counter++;
}
else {

    deviceSize = CGSizeMake(ceil (width), ceil(height));
}
deviceSize = CGSizeMake(deviceSize.width, deviceSize.height);

Ответ 4

Например, у вас ширина экрана = 320, когда вы делите ее на 3, у вас есть 106,6666. Если рассматривать его как Int, мы имеем: 106 * 3 = 318. Нам нужно 2 пикселя добавить на 1 пиксель к первым двум ячейкам, потому что 320 - 318 = 2. Попробуйте это решение ниже.

public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let columns = 3 
    let width = Int(UIScreen.main.bounds.width)
    let side = width / columns
    let rem = width % columns
    let addOne = indexPath.row % columns < rem
    let ceilWidth = addOne ? side + 1 : side
    return CGSize(width: ceilWidth, height: side)
}