UICollectionViewCell 宽度大于我在 sizeForItemAt 中设置的宽度
UICollectionViewCell width is bigger than what I set in sizeForItemAt
我的 UICollectionView
的 Width/height 匹配所有可用的 space.
我想在一行(两列)中显示两个单元格
所以一个单元格的宽度应该是UICollectionView
宽度的一半(collectionView.frame.width / 2
)
所以我以编程方式更改单元格的宽度 UICollectionViewDelegateFlowLayout
:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: collectionView.frame.width / 2.0, height: 150)
}
但单元格的视觉宽度比 collectionView.frame.width / 2.0
大得多(在 iPhone SE 模拟器上测试)
所以它需要超过屏幕的一半宽度space
这里我打印了关于尺码的信息:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath)
print("didSelectItemAt \(cell.frame.width), table width: \(collectionView.frame.width), item calc width: \(collectionView.frame.width / 2)")
}
didSelectItemAt cell width 187.5, table width: 375.0, half-width:
187.5
为什么会这样?
边距也有问题,但首先我必须解决这个问题
更新
虽然它在 iPhone 6s 模拟器上运行良好(我编辑了图像以将两个项目放在第一行以检查它们是否适合):
所以 iPhone SE 有什么问题?
我不想发现其他 iPhone 或 iPad 也可能存在同样的问题
375.0 是 iPhone 6s 和 X 的大小,而不是 iPhone SE 是 320.0
原因是在 iPhone 6s 模式下设置了 collectionView 的宽度约束,但后来切换到 SE 模拟器时,此约束没有更新。
我认为单元格间距有问题。您的实现中似乎存在默认单元格间距。你应该尝试下面的代码来调整一个集合视图中的两个单元格:
extension ViewController : UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let collectionViewWidth = collectionView.bounds.width
return CGSize(width: collectionViewWidth/2, height: 150)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
}
此外,您应该检查 UICollectionView
的约束条件是否符合您的要求。
尝试使用 wide from view,而不是 collectionView。
试试这个:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: (view.frame.width / 2.0) - 5, height: 150) // provide little bit space between cells
}
希望这会有所帮助。
最好的解决方案是,在主线程中延迟一点重新加载您的集合视图。
DispatchQueue.main.asyncAfter(deadline: .now() + 0.10) {
self.myCollectionView.reloadData()
}
UICollectionView
的 Width/height 匹配所有可用的 space.
我想在一行(两列)中显示两个单元格
所以一个单元格的宽度应该是UICollectionView
宽度的一半(collectionView.frame.width / 2
)
所以我以编程方式更改单元格的宽度 UICollectionViewDelegateFlowLayout
:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: collectionView.frame.width / 2.0, height: 150)
}
但单元格的视觉宽度比 collectionView.frame.width / 2.0
大得多(在 iPhone SE 模拟器上测试)
所以它需要超过屏幕的一半宽度space
这里我打印了关于尺码的信息:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath)
print("didSelectItemAt \(cell.frame.width), table width: \(collectionView.frame.width), item calc width: \(collectionView.frame.width / 2)")
}
didSelectItemAt cell width 187.5, table width: 375.0, half-width: 187.5
为什么会这样?
边距也有问题,但首先我必须解决这个问题
更新
虽然它在 iPhone 6s 模拟器上运行良好(我编辑了图像以将两个项目放在第一行以检查它们是否适合):
所以 iPhone SE 有什么问题?
我不想发现其他 iPhone 或 iPad 也可能存在同样的问题
375.0 是 iPhone 6s 和 X 的大小,而不是 iPhone SE 是 320.0
原因是在 iPhone 6s 模式下设置了 collectionView 的宽度约束,但后来切换到 SE 模拟器时,此约束没有更新。
我认为单元格间距有问题。您的实现中似乎存在默认单元格间距。你应该尝试下面的代码来调整一个集合视图中的两个单元格:
extension ViewController : UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let collectionViewWidth = collectionView.bounds.width
return CGSize(width: collectionViewWidth/2, height: 150)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
}
此外,您应该检查 UICollectionView
的约束条件是否符合您的要求。
尝试使用 wide from view,而不是 collectionView。
试试这个:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: (view.frame.width / 2.0) - 5, height: 150) // provide little bit space between cells
}
希望这会有所帮助。
最好的解决方案是,在主线程中延迟一点重新加载您的集合视图。
DispatchQueue.main.asyncAfter(deadline: .now() + 0.10) {
self.myCollectionView.reloadData()
}