CollectionView 未按预期显示 3 列
CollectionView not displaying 3 columns as expected
我在同一个 UIViewController
中有 3 个不同的 UICollectionView
。他们工作正常。我的问题是样式,其中 2 个需要具有相同的样式——这意味着 3 列和一些间距。
这是我需要实现的目标:
screenshot
这是我目前得到的:
desired result
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if collectionView == gameCollectionView {
let width = gameCollectionView.frame.size.width
return CGSize(width: ((width / 2) - 7), height: 150)
}
else {
let width = paymentCollectionView.bounds.width / 3 // < THIS IS What should give 3 columns
return CGSize(width: width, height: 70)
}
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
谁能告诉我如何实现这一点,最好能解释一下它是如何工作的,因为我无法弄清楚
更新:根据要求 - CollectionView 的故事板
Storyboard
CGSize(width: ((width - `section's left & right spce` - minimumInteritemSpacing) / `numberofCellYouWant`), height: 150)
你可以从 collectionView.collectionViewLayout
属性
得到 minimumInteritemSpacing
您需要更改此委托工作
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if collectionView == gameCollectionView {
let width = gameCollectionView.frame.size.width
return CGSize(width: ((width / 2) - 7), height: 150)
}
else {
let width = (paymentCollectionView.frame.width / 3) - 5 // if you want to more space so increase
return CGSize(width: width, height: 70)
}
}
你可以试试这个
let screenWidth = self.CollecionView.frame.width
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: (screenWidth/3)-5, height: (screenWidth/3)-5)
self.CollecionView.collectionViewLayout = layout
如果您计划为 iOS 13 岁或以上 进行部署,我建议您使用 Compositional Layout 来实现这个网格。
资源
Apple 在这方面有一个很棒的 WWDC 和一个 SDK,您可以下载它来查看他们的示例代码。这是 links:
Advances in Collection View Layout WWDC 2019
推荐
我还建议将所有三个集合视图包装在这个单一集合视图中。这可以使用组合布局轻松实现。
示例代码
下面的示例来自上面的 link。您可以通过简单地在您的组中定义它来布局 3 列。或者,您可以将项目布置为其组容器的一部分。
func createLayout() -> UICollectionViewLayout {
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),
heightDimension: .fractionalHeight(1.0))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),
heightDimension: .absolute(44))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 3)
let spacing = CGFloat(10)
group.interItemSpacing = .fixed(spacing)
let section = NSCollectionLayoutSection(group: group)
section.interGroupSpacing = spacing
section.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10)
let layout = UICollectionViewCompositionalLayout(section: section)
return layout
}
}
我在同一个 UIViewController
中有 3 个不同的 UICollectionView
。他们工作正常。我的问题是样式,其中 2 个需要具有相同的样式——这意味着 3 列和一些间距。
这是我需要实现的目标: screenshot
这是我目前得到的: desired result
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if collectionView == gameCollectionView {
let width = gameCollectionView.frame.size.width
return CGSize(width: ((width / 2) - 7), height: 150)
}
else {
let width = paymentCollectionView.bounds.width / 3 // < THIS IS What should give 3 columns
return CGSize(width: width, height: 70)
}
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
谁能告诉我如何实现这一点,最好能解释一下它是如何工作的,因为我无法弄清楚
更新:根据要求 - CollectionView 的故事板 Storyboard
CGSize(width: ((width - `section's left & right spce` - minimumInteritemSpacing) / `numberofCellYouWant`), height: 150)
你可以从 collectionView.collectionViewLayout
属性
minimumInteritemSpacing
您需要更改此委托工作
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if collectionView == gameCollectionView {
let width = gameCollectionView.frame.size.width
return CGSize(width: ((width / 2) - 7), height: 150)
}
else {
let width = (paymentCollectionView.frame.width / 3) - 5 // if you want to more space so increase
return CGSize(width: width, height: 70)
}
}
你可以试试这个
let screenWidth = self.CollecionView.frame.width
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: (screenWidth/3)-5, height: (screenWidth/3)-5)
self.CollecionView.collectionViewLayout = layout
如果您计划为 iOS 13 岁或以上 进行部署,我建议您使用 Compositional Layout 来实现这个网格。
资源
Apple 在这方面有一个很棒的 WWDC 和一个 SDK,您可以下载它来查看他们的示例代码。这是 links:
Advances in Collection View Layout WWDC 2019
推荐
我还建议将所有三个集合视图包装在这个单一集合视图中。这可以使用组合布局轻松实现。
示例代码
下面的示例来自上面的 link。您可以通过简单地在您的组中定义它来布局 3 列。或者,您可以将项目布置为其组容器的一部分。
func createLayout() -> UICollectionViewLayout {
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),
heightDimension: .fractionalHeight(1.0))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),
heightDimension: .absolute(44))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 3)
let spacing = CGFloat(10)
group.interItemSpacing = .fixed(spacing)
let section = NSCollectionLayoutSection(group: group)
section.interGroupSpacing = spacing
section.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10)
let layout = UICollectionViewCompositionalLayout(section: section)
return layout
}
}