Eu estou tentando adicionar UICollectionView
a ViewController
, e eu preciso ter 3 células 'por linha', sem espaço em branco entre as células (que deve olhar como uma grade). A largura da célula deve ser um terço do tamanho da tela, então pensei que a layout.item
largura deveria ser a mesma. Mas então eu entendi:
Se eu reduzir esse tamanho (por 7 ou 8 pixels, por exemplo), é melhor, mas a terceira célula da linha não é completamente visível e ainda tenho esse espaço em branco (superior e inferior, esquerda e direita).
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
}
}
Respostas:
Adicione estas 2 linhas
Então você tem:
Isso removerá todos os espaços e fornecerá um layout de grade:
Se você deseja que a primeira coluna tenha uma largura igual à largura da tela, adicione a seguinte função:
O layout da grade agora terá a aparência (também adicionei um plano de fundo azul à primeira célula):
fonte
Para Swift 3 e XCode 8 , isso funcionou. Siga as etapas abaixo para conseguir isso: -
Coloque esse código na função viewDidLoad ().
fonte
Em certas situações, definir o
UICollectionViewFlowLayout
inviewDidLoad
ouViewWillAppear
pode não afetar o collectionView.Definir o
UICollectionViewFlowLayout
noviewDidAppear
pode causar ver as alterações dos tamanhos células em tempo de execução.Outra solução, no Swift 3:
fonte
Se você estiver procurando pelo Swift 3, siga as etapas para conseguir isso:
Isso é verificado no Xcode 8.0 com Swift 3.
fonte
fonte
Swift 4
fonte
Para Swift 3 e XCode 8, isso funcionou. Siga as etapas abaixo para conseguir isso: -
fonte
Para Swift 3+ e Xcode 9+, tente usar este
fonte
Swift 5: para espaços distribuídos uniformemente entre células com largura de célula dinâmica para aproveitar ao máximo o espaço do contêiner, você pode usar o snippet de código abaixo fornecendo um valor mínimo de CellWidth .
fonte