来自不同 iPhone 设备的动态集合视图单元格列
Dynamic collection view cell column from different iPhone device
我尝试使用 collectionView 从不同的 iPhone 设备创建动态单元格列。
我已经尝试让 iPhone SE 有一个 3 列并且成功了,但是当我尝试让 iPhone 11 Pro Max 有一个 4 列时它有一个 space每个单元格之间。
iPhone 11 专业最大
iPhone SE
我这样计算我的单元格
enum UIHelper {
static func createCollectionViewFlowLayout() -> UICollectionViewFlowLayout {
let screenWidth = UIScreen.main.bounds.width
let padding: CGFloat = 12
let minimumInterimSpacing: CGFloat = 10
let availableWidth = screenWidth - (padding * 2) - (minimumInterimSpacing * 2)
var numberOfColumn: CGFloat
// 375 is iPhone SE width
if screenWidth > 375 {
numberOfColumn = 4
} else {
numberOfColumn = 3
}
let itemWidth = availableWidth / numberOfColumn
let flowLayout = UICollectionViewFlowLayout()
flowLayout.sectionInset = UIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding)
flowLayout.itemSize = CGSize(width: itemWidth, height: itemWidth)
return flowLayout
}
}
在我的视图控制器中,我是这样创建的
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
collectionView.dataSource = self
collectionView.collectionViewLayout = UIHelper.createCollectionViewFlowLayout()
}
我错过了什么?
你的设置似乎没问题,问题似乎出在这一行的逻辑/数学上
let availableWidth = screenWidth - (padding * 2) - (minimumInterimSpacing * 2)
逻辑是,如果你有 3 个单元格,则 3 个单元格之间会有 2 个间隙,但如果你有 4 个单元格,则有 3 个间隙。
因此,如果我还根据我打算拥有的单元格数量更改可用宽度,您将获得所需的结果。因此,我做了一些小改动,以根据您想要的一行中的单元格数量来更改可用宽度。
我对您的代码进行了一些小的修改,我添加了一些注释以显示我所做的更改,但是,您需要更好地组织我的更新,因为我进行了快速更改以向您展示逻辑中的修复.
static func createCollectionViewFlowLayout() -> UICollectionViewFlowLayout {
let screenWidth = UIScreen.main.bounds.width
let padding: CGFloat = 12
let minimumInterimSpacing: CGFloat = 10
// Updated this to a var
var availableWidth = screenWidth - (padding * 2) - (minimumInterimSpacing * 2)
var numberOfColumn: CGFloat
// 375 is iPhone SE width
if screenWidth > 375 {
numberOfColumn = 4
// Update the width available as well
availableWidth = screenWidth - (padding * 2) - (minimumInterimSpacing * (numberOfColumn - 1))
} else {
numberOfColumn = 3
}
let itemWidth = availableWidth / numberOfColumn
print(numberOfColumn)
let flowLayout = UICollectionViewFlowLayout()
flowLayout.minimumInteritemSpacing = minimumInterimSpacing
flowLayout.sectionInset = UIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding)
flowLayout.itemSize = CGSize(width: itemWidth, height: itemWidth)
return flowLayout
}
我尝试使用 collectionView 从不同的 iPhone 设备创建动态单元格列。
我已经尝试让 iPhone SE 有一个 3 列并且成功了,但是当我尝试让 iPhone 11 Pro Max 有一个 4 列时它有一个 space每个单元格之间。
iPhone 11 专业最大
iPhone SE
我这样计算我的单元格
enum UIHelper {
static func createCollectionViewFlowLayout() -> UICollectionViewFlowLayout {
let screenWidth = UIScreen.main.bounds.width
let padding: CGFloat = 12
let minimumInterimSpacing: CGFloat = 10
let availableWidth = screenWidth - (padding * 2) - (minimumInterimSpacing * 2)
var numberOfColumn: CGFloat
// 375 is iPhone SE width
if screenWidth > 375 {
numberOfColumn = 4
} else {
numberOfColumn = 3
}
let itemWidth = availableWidth / numberOfColumn
let flowLayout = UICollectionViewFlowLayout()
flowLayout.sectionInset = UIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding)
flowLayout.itemSize = CGSize(width: itemWidth, height: itemWidth)
return flowLayout
}
}
在我的视图控制器中,我是这样创建的
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
collectionView.dataSource = self
collectionView.collectionViewLayout = UIHelper.createCollectionViewFlowLayout()
}
我错过了什么?
你的设置似乎没问题,问题似乎出在这一行的逻辑/数学上
let availableWidth = screenWidth - (padding * 2) - (minimumInterimSpacing * 2)
逻辑是,如果你有 3 个单元格,则 3 个单元格之间会有 2 个间隙,但如果你有 4 个单元格,则有 3 个间隙。
因此,如果我还根据我打算拥有的单元格数量更改可用宽度,您将获得所需的结果。因此,我做了一些小改动,以根据您想要的一行中的单元格数量来更改可用宽度。
我对您的代码进行了一些小的修改,我添加了一些注释以显示我所做的更改,但是,您需要更好地组织我的更新,因为我进行了快速更改以向您展示逻辑中的修复.
static func createCollectionViewFlowLayout() -> UICollectionViewFlowLayout {
let screenWidth = UIScreen.main.bounds.width
let padding: CGFloat = 12
let minimumInterimSpacing: CGFloat = 10
// Updated this to a var
var availableWidth = screenWidth - (padding * 2) - (minimumInterimSpacing * 2)
var numberOfColumn: CGFloat
// 375 is iPhone SE width
if screenWidth > 375 {
numberOfColumn = 4
// Update the width available as well
availableWidth = screenWidth - (padding * 2) - (minimumInterimSpacing * (numberOfColumn - 1))
} else {
numberOfColumn = 3
}
let itemWidth = availableWidth / numberOfColumn
print(numberOfColumn)
let flowLayout = UICollectionViewFlowLayout()
flowLayout.minimumInteritemSpacing = minimumInterimSpacing
flowLayout.sectionInset = UIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding)
flowLayout.itemSize = CGSize(width: itemWidth, height: itemWidth)
return flowLayout
}