#ios #swift #uicollectionview #uicollectionviewcell
#iOS #swift #uicollectionview #uicollectionviewcell
Вопрос:
Я использую UICollectionView
приведенный ниже мой код, как я могу убрать вертикальный интервал? Я попытался установить, UICollectionViewFlowLayout
но ничего не получилось.
class ViewController: UIViewController {
@IBOutlet weak var cv: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
cv.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
layout.sectionInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
let xx : CGFloat = (UIScreen.main.bounds.width / 8)
let yy : CGFloat = 6.0
layout.itemSize = CGSize(width: xx, height: yy)
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 1
cv!.collectionViewLayout = layout
}
}
extension ViewController: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 70
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
if (indexPath.row/2 == 0) {
cell.backgroundColor = UIColor.blue.withAlphaComponent(12)
}
else if (indexPath.row/4 == 0) {
cell.backgroundColor = UIColor.blue.withAlphaComponent(0.5)
}
else{
cell.backgroundColor = UIColor.blue.withAlphaComponent(0.1)
}
return cell
}
}
Ответ №1:
вы можете использовать UICollectionViewDelegateFlowLayout
protcol и minimumInteritemSpacingForSectionAt
/ или minimumLineSpacingForSectionAt
функции, подобные приведенному ниже коду:
extension ViewController: UICollectionViewDelegateFlowLayout {
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 10 // or any value
}
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 10 // or any value
}
}
Ответ №2:
Интервал в вашем случае обусловлен шириной размера, в основном, каждого элемента.
Итак, у вас есть этот код для вычисления ширины вашего отдельного элемента:
let xx : CGFloat = (UIScreen.main.bounds.width / 8)
Но поскольку у вас есть вставки разделов, ваш расчет должен измениться или вам придется удалить вставки, поэтому либо:
let xx : CGFloat = (UIScreen.main.bounds.width - 10 / 8)
// 10 = 5 left 5 right is taken for section insets
Или удалите вставки разделов:
// layout.sectionInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
Если вы хотите указать начальную / конечную маржу, вместо этого используйте ограничения коллекции, т. Е. Ограничьте collectionView
leadingAnchor
/ trailingAnchor
его супервизора константой (скажем, 5), тогда вам не нужно выполнять вычисления, поскольку вы можете использовать метод sizeForItem
делегирования и возвращать вычисления таким образом:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: collectionView.bounds.width / 8, height: 5.0)
}