2017-07-03 99 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

相關問題