ios - CollectionView 在 iPhone SE 模拟器上产生错误,但在 iPhone 11 模拟器上却没有
问题描述
我是 SWIFT 的菜鸟,但我正在尝试创建一个 CollectionView。当我在 iPhone 11 模拟器上运行以下代码时,CollectionView 每行给我三个图像,这是我想要的结果。但是,当我在任何其他设备上运行代码时,我会在每行的第一个和第三个单元格之间看到一个空白单元格。下图显示了工作版本(11 max pro)和有缺陷的版本(SE)之间的区别。我不确定我做错了什么或如何纠正它。我愿意接受有关如何修复它或编写代码的更好方法的任何建议。
var collectionViewFlowLayout: UICollectionViewFlowLayout!
let cellIdentifier = "ItemCollectionViewCell"
override func viewDidLoad() {
super.viewDidLoad()
setupCollectionView()
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
setupCollectionViewItemSize()
}
private func setupCollectionView(){
collectionView.delegate = self
collectionView.dataSource = self
let nib = UINib(nibName: "ItemCollectionViewCell", bundle: nil)
collectionView.register(nib, forCellWithReuseIdentifier: cellIdentifier)
}
private func setupCollectionViewItemSize(){
if collectionViewFlowLayout == nil {
let numberOfItemsPerRow: CGFloat = 3
let lineSpacing: CGFloat = 5
let interItemSpacing: CGFloat = 5
let width = (collectionView.frame.width - (numberOfItemsPerRow - 1) * interItemSpacing) / numberOfItemsPerRow
let height = width
collectionViewFlowLayout = UICollectionViewFlowLayout()
collectionViewFlowLayout.itemSize = CGSize(width: width, height: height)
collectionViewFlowLayout.sectionInset = UIEdgeInsets.zero
collectionViewFlowLayout.scrollDirection = .vertical
collectionViewFlowLayout.minimumLineSpacing = lineSpacing
collectionViewFlowLayout.minimumInteritemSpacing = interItemSpacing
collectionView.setCollectionViewLayout(collectionViewFlowLayout, animated: true)
}
}
解决方案
我能够通过将 UICollectionViewDelegateFlowLayout 添加到视图控制器以及我在 SO 上找到的函数来解决它。
extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! ItemCollectionViewCell
cell.imageView.image = UIImage(named: items[indexPath.item].imageName)
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let item = items[indexPath.item]
performSegue(withIdentifier: viewImageSegueIdentifier, sender: item)
}
//****This is the function that I added ****//
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let noOfCellsInRow = 3
let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
let totalSpace = flowLayout.sectionInset.left
+ flowLayout.sectionInset.right
+ (flowLayout.minimumInteritemSpacing * CGFloat(noOfCellsInRow - 1))
let size = Int((collectionView.bounds.width - totalSpace) / CGFloat(noOfCellsInRow))
return CGSize(width: size, height: size)
}
}
推荐阅读
- django - 芹菜与 django
- android - 无法将子模块添加到android项目
- java - 我如何知道在 Android Studio 中选择了哪个单选按钮
- kotlin - kotlin - 检查editText内容是否已被用户或以编程方式修改
- php - 登录 php 网站并自动登录到运行在不同服务器上的 Drupal 网站?
- java - Android sdk 26 及更高版本 - 调用 JNI GetObjectField 并带有未决异常 java.lang.NoSuchFieldError 用于自定义数组对象
- typescript - 如何将接口转换为特定接口数组
- tfs - 将组织从 VSTS 迁移到 TFS
- vb.net - .NET:不要让 SQLite 内存数据库工作
- git - Git 合并 - 使用我的更改解决冲突