根据内容居中水平 UICollectionView

Posted

技术标签:

【中文标题】根据内容居中水平 UICollectionView【英文标题】:Center horizontal UICollectionView based on content 【发布时间】:2020-08-04 11:46:15 【问题描述】:

我有一个工作正常的水平 UICollectionView。但是当不需要滚动时,我想将单元格居中。即

    如果所有单元格都能够适应视图宽度并且用户不需要滚动然后将单元格居中 如果所有单元格都无法适应视图宽度并且用户需要滚动不要将单元格居中(默认行为)

图形示例:

    UICollectionView 需要滚动然后保持默认行为

    不需要滚动的 UICollectionView

到目前为止我所做的尝试:

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout 

    var dataList:[String] = ["icon_rotate", "icon_rotate2", "icon_rotate3", "icon_rotate4", "icon_rotate5", "icon_rotate6"]

 
    override func viewDidLoad() 
       super.viewDidLoad()
       //other stuff
    

    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat 
      return (UIDevice.current.userInterfaceIdiom == .pad) ? 20.0 : 10.0
    

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat 
      return (UIDevice.current.userInterfaceIdiom == .pad) ? 20.0 : 10.0
    



    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
       return CGSize(width: collectionView.frame.size.height * 0.75, height: collectionView.frame.size.height * 0.75)
     

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
      return dataList.count
     

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "editorCell", for: indexPath) as! EditorCell
    
    cell.iconView.image = UIImage(named: dataList[indexPath.row])
    
    
    return cell
   


这会导致 UICollectionView 的默认行为,所以我在 SO 中搜索并找到了这篇文章:How to center horizontally UICollectionView Cells? 我添加了这段代码:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets 

  let totalCellWidth = CellWidth * CellCount
  let totalSpacingWidth = CellSpacing * (CellCount - 1)

  let leftInset = (collectionViewWidth - CGFloat(totalCellWidth + totalSpacingWidth)) / 2
  let rightInset = leftInset

  return UIEdgeInsets(top: 0, left: leftInset, bottom: 0, right: rightInset)

当要加载的单元格很少时,此代码可以正常工作,但我希望它能够动态检测是否需要居中或让默认行为保持有效。

谢谢

【问题讨论】:

看这个:***.com/a/49617263/718925 【参考方案1】:

假设您当前的代码在您适合单元格时工作 - 也就是说,它在需要时将“单元格行”居中 - 更改此行:

let leftInset = (collectionViewWidth - CGFloat(totalCellWidth + totalSpacingWidth)) / 2

到:

let leftInset = max(0, (collectionViewWidth - CGFloat(totalCellWidth + totalSpacingWidth)) / 2.0)

这样你的插图永远不会小于零

【讨论】:

感谢@DonMag 提供此解决方案。我对其进行了测试,它在 iPhone 和 iPad 上都能完美运行。再次感谢伙计!

以上是关于根据内容居中水平 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

如何水平居中 UICollectionView 单元格?

如何根据 UITableViewCell 中的内容调整水平 UICollectionView 的高度

Swift 3:如何将 UICollectionView 中的最后一行单元格水平居中,只有一个部分?

如何垂直居中 UICollectionView 内容

如何旋转类似于照片应用程序的 UICollectionView 并保持当前视图居中?

实现div内容水平垂直居中