Ответ 1
Лучше избегать двойного числа в аналогичных ситуациях. Использование:
return CGSizeMake(ceil(totalWidth), ceil(totalHeight))
Я установил 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)
}
Лучше избегать двойного числа в аналогичных ситуациях. Использование:
return CGSizeMake(ceil(totalWidth), ceil(totalHeight))
У меня была та же проблема, я исправил ее с помощью кода ниже:
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)
Вот мое решение для выпуска просто сделать среднюю ячейку шириной 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);
Например, у вас ширина экрана = 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)
}