2017-07-03 113 views
1

我有一个非常简单的UICollectionView要求。对于iPhone 6/6s/7和6/6s/7 Plus尺寸,两个单元必须并排显示,即每行两个单元。而对于iPhone 5/5s/SE,它应该显示每行1个单元。我的细胞高度几乎固定在194为各种iPhone屏幕尺寸动态调整UICollectionView单元宽度的宽度

现在我有这样的代码在视图控制器来实现这一somewhat-

import UIKit 

class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource { 

    @IBOutlet weak var collectionView: UICollectionView! 
    var screenWidth: CGFloat! 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.backgroundColor = .blue 

     screenWidth = collectionView.frame.width 

     // Do any additional setup after loading the view, typically from a nib 
     let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
//  layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 2) 
     layout.itemSize = CGSize(width: screenWidth/2, height: 194) 
     layout.minimumInteritemSpacing = 0 
     collectionView.collectionViewLayout = layout 
     collectionView.dataSource = self 
     collectionView.delegate = self 
     collectionView.backgroundColor = UIColor.blue 
    } 

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
     return 1 
    } 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return 20 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCell", for: indexPath as IndexPath) as UICollectionViewCell 
     cell.backgroundColor = UIColor.white 
     cell.layer.borderColor = UIColor.black.cgColor 
     cell.layer.borderWidth = 0.5 
     return cell 
    } 

} 

输出的结果是这个 -

enter image description here

正如你所看到的,iPhone Plus的尺寸和5/5s/SE的布局是好的,或者我应该说,我对那些有我所拥有的,但第二即6/6s/7尺寸的细胞几乎卡住对彼此。我知道我有layout.minimumInteritemSpacing = 0,但是如果我将它增加到1,那么单元格将像第三个图像一样被压下,使用UIEdgeInsets也会导致同样的问题。

我的整个UICollectionView被固定在顶端0,底部0,左边8和右边8到超级视图。我回顾了几个Q &正如在SO这是有点相关,并建议使用UICollectionViewDelegateFlowLayoutsizeForItemAt功能,但我还没有能够解决这个使用。

如何解决6/6s/7屏幕宽度的间距问题,让两个单元格以一定间距排成一行?我的最终目标是在设备6及以上的设备上每行有2个单元,对于设备5s及以下(包括SE),每行有1个单元。这可以做到吗?

回答

2

在创建size之前,您需要考虑collectionView的s edge insetsminimumInteritemSpacing。你应该真的实施UICollectionViewFlowLayoutDelegate方法来布置collectionView。您的width应该是(screenSize - left inset - right inset - minimumInteritemSpacing)/2

编辑

为什么不检查它是什么device然后return基于一个size

e.g

if iPhone6 { 
    return size/2 
} else { 
    return size 
} 

要检查它目前是什么设备参考以下answer

+0

Harry,我尝试过'sizeForItemAt',虽然它解决了间距问题,但它也使我修复了每个设备上每行的单元数量,这并不是我的要求。我的要求是为设备iPhone 6和更高版本显示每行2个单元,并在设备5s/5/SE上显示每行1个单元。不知道这是否是可能的。 – Annjawn

+0

更新了我的答案 –

+0

太好了。我一直在寻找类似于在网络中使用媒体查询的东西。但不幸的是,现在我看到了大量的模型,我不希望苹果发布下一个应用程序时应用程序中断。我用你以前推荐的方法使用UICollectionViewDelegateFlowLayout,虽然它会使每行固定的单元数目我现在满意。谢谢您的帮助。 – Annjawn

相关问题