Я пытаюсь добавить UICollectionView
к ViewController
, и мне нужно иметь 3 ячейки «на строку» без пустого пространства между ячейками (он должен выглядеть как сетка). Ширина ячейки должна составлять треть размера экрана, поэтому я подумал, что layout.item
ширина должна быть одинаковой. Но тогда я получаю это:
Если я уменьшу этот размер (например, на 7 или 8 пикселей ), это будет лучше, но третья ячейка в строке не видна полностью, и у меня все еще есть это пустое пространство (сверху и снизу, слева и справа).
class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
var collectionView: UICollectionView?
var screenSize: CGRect!
var screenWidth: CGFloat!
var screenHeight: CGFloat!
override func viewDidLoad() {
super.viewDidLoad()
screenSize = UIScreen.mainScreen().bounds
screenWidth = screenSize.width
screenHeight = screenSize.height
// Do any additional setup after loading the view, typically from a nib
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0)
layout.itemSize = CGSize(width: screenWidth / 3, height: screenWidth / 3)
collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
collectionView!.dataSource = self
collectionView!.delegate = self
collectionView!.registerClass(CollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
collectionView!.backgroundColor = UIColor.greenColor()
self.view.addSubview(collectionView!)
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 20
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as CollectionViewCell
cell.backgroundColor = UIColor.whiteColor()
cell.layer.borderColor = UIColor.blackColor().CGColor
cell.layer.borderWidth = 0.5
cell.frame.size.width = screenWidth / 3
cell.frame.size.height = screenWidth / 3
cell.textLabel?.text = "\(indexPath.section):\(indexPath.row)"
return cell
}
}
Ответы:
Добавьте эти 2 строки
Так что у тебя есть:
Это удалит все пробелы и даст вам сетку:
Если вы хотите, чтобы первый столбец имел ширину, равную ширине экрана, добавьте следующую функцию:
Макет сетки теперь будет выглядеть (я также добавил синий фон в первую ячейку):
источник
Для Swift 3 и XCode 8 это сработало. Выполните следующие шаги для достижения этого: -
Поместите этот код в функцию viewDidLoad ().
источник
В некоторых ситуациях, Установка
UICollectionViewFlowLayout
вviewDidLoad
илиViewWillAppear
не может повлиять на CollectionView.Установка
UICollectionViewFlowLayout
inviewDidAppear
может привести к просмотру изменений размеров ячеек во время выполнения.Другое решение в Swift 3:
источник
Если вы ищете Swift 3, выполните следующие действия:
Это проверено на Xcode 8.0 с Swift 3.
источник
источник
Swift 4
источник
Для Swift 3 и XCode 8 это сработало. Выполните следующие шаги для достижения этого: -
источник
Для Swift 3+ и Xcode 9+ Попробуйте использовать это
источник
Swift 5: Для равномерно распределенных пространств между ячейками с динамической шириной ячеек, чтобы максимально использовать пространство контейнера, вы можете использовать фрагмент кода ниже, предоставив значение minimalCellWidth .
источник