Próbuję dodać UICollectionView
do ViewController
, i muszę mieć komórki 3 „w rzędzie” bez pustej przestrzeni pomiędzy komórkami (powinien wyglądać siatce). Szerokość komórki powinna wynosić jedną trzecią rozmiaru ekranu, więc pomyślałem, że layout.item
szerokość powinna być taka sama. Ale wtedy rozumiem:
Jeśli zmniejszę ten rozmiar (np. O 7 lub 8 pikseli ), będzie lepiej, ale trzecia komórka w rzędzie nie jest całkowicie widoczna i nadal mam tę pustą przestrzeń (góra i dół oraz lewa i prawa).
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
}
}
Odpowiedzi:
Dodaj te 2 linie
Więc masz:
To usunie wszystkie spacje i da ci układ siatki:
Jeśli chcesz, aby pierwsza kolumna miała szerokość równą szerokości ekranu, dodaj następującą funkcję:
Układ siatki będzie teraz wyglądał (dodałem też niebieskie tło do pierwszej komórki):
źródło
W przypadku Swift 3 i XCode 8 to zadziałało. Wykonaj poniższe kroki, aby to osiągnąć: -
Umieść ten kod w funkcji viewDidLoad ().
źródło
W niektórych sytuacjach ustawienie
UICollectionViewFlowLayout
inviewDidLoad
lubViewWillAppear
może nie mieć wpływu na collectionView.Ustawienie
UICollectionViewFlowLayout
inviewDidAppear
może spowodować zobaczenie zmian rozmiarów komórek w czasie wykonywania.Inne rozwiązanie w Swift 3:
źródło
Jeśli szukasz Swift 3, postępuj zgodnie z instrukcjami, aby to osiągnąć:
Jest to weryfikowane w Xcode 8.0 ze Swift 3.
źródło
źródło
Szybki 4
źródło
W przypadku Swift 3 i XCode 8 to zadziałało. Wykonaj poniższe kroki, aby to osiągnąć: -
źródło
Dla Swift 3+ i Xcode 9+ Spróbuj tego użyć
źródło
Swift 5: Aby uzyskać równomiernie rozmieszczone spacje między komórkami z dynamiczną szerokością komórki, aby jak najlepiej wykorzystać przestrzeń kontenera, możesz użyć poniższego fragmentu kodu, podając minimalną wartość CellWidth .
źródło