2017-07-03 13 views
1

私は非常に単純なUICollectionView要件を持っています。 iPhone 6/6s/7および6/6s/7 Plusサイズの場合、2つのセルが並んでいる、つまり1行に2つのセルが並んでいる必要があります。 iPhone 5/5s/SEの場合、1行に1セルが表示されます。私のセルの高さは、今、私はこれがさまざまなiPhone画面サイズのUICollectionViewセル幅の動的サイジング幅

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 
    } 

} 

は、結果の出力がthis-

enter image description here

あるsomewhat-達成するためのビューコントローラでこのコードを持っている194

にほとんど固定されています。あなたが見ることができるように、iPhone Plusのサイズと5/5s/SEレイアウトはうまくいますか、私は自分の持っているものでうまくいくと言うべきですが、2番目の6/6/7サイズのセルは、お互いに。私はlayout.minimumInteritemSpacing = 0を持っていることを知っていますが、これを1だけ増やしても、セルは第3の画像のようにプッシュダウンされます。UIEdgeInsetsも同じ問題を引き起こします。

私のUICollectionView全体が、上の0、下の0、左の8、右の8がスーパービューに固定されています。私はいくつかのQ &を見直しました。これはやや関連しており、UICollectionViewDelegateFlowLayoutsizeForItemAt機能を使用することを示唆していますが、これを使って解決することはできませんでした。

6/6s/7スクリーン幅のスペースの問題を解決して、間隔をあけて2つのセルを1行に配置するにはどうすればよいですか?私の究極の目標は、デバイス6とそれ以上で1行に2セル、デバイス5とそれ以下(SEを含む)で1行に1セルを持つことです。これはできますか?

答えて

2

sizeを作成する前にとminimumInteritemSpacingを考慮する必要があります。 collectionViewのレイアウト方法は、実際にUICollectionViewFlowLayoutDelegateの方法を実装する必要があります。 width(screenSize - left inset - right inset - minimumInteritemSpacing)/2である必要があります。

EDIT

は、なぜそれが何であるかdeviceチェックしないと、それに基づいてsizeその後、return

例えば

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

それは現在、次のanswerを参照してください何であるか、デバイスを確認するには。

+0

ハリー、私は 'sizeForItemAt'を試してみましたが、間隔の問題を解決しましたが、それは私の必要条件ではないデバイス上の1行あたりのセル数を修正します。私の要件は、デバイス5S/5/SEでは、デバイスiPhone 6以上で1行に2セル、1行に1セルを表示することです。それが可能であるかどうかはわかりません。 – Annjawn

+0

更新された私の答え –

+0

素晴らしい。私はウェブでメディアクエリを使うのとほとんど同じようなものを探していました。しかし残念ながら、私はモデルの完全な数を見ているので、私はAppleが次のものをリリースするとすぐに壊れないようにしたい。私はUICollectionViewDelegateFlowLayoutを使用して以前に推奨されていたアプローチを使用しましたが、それは1行あたりのセル数を固定しますが、今は満足しています。助けてくれてありがとう。 – Annjawn

関連する問題