2017-12-13 8 views
1

に従わない:私はUICollectionViewは、だから私は、次のコードを持ってCollectionViewを持っUICollectionViewDelegateFlowLayoutとインセット

class MyViewController: UIViewController { 
    ... 
    @IBOutlet weak var imageCollectionView: UICollectionView! 
    fileprivate let sectionInsets = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1) 
    fileprivate let itemsPerRow: CGFloat = 3 
    ... 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     imageCollectionView.delegate = self 
     imageCollectionView.dataSource = self 
    } 
} 

... 

extension MyViewController : UICollectionViewDelegateFlowLayout { 
    func collectionView(_ collectionView: UICollectionView, 
         layout collectionViewLayout: UICollectionViewLayout, 
         sizeForItemAt indexPath: IndexPath) -> CGSize { 

     let paddingSpace = sectionInsets.left * (itemsPerRow + 1) 
     let availableWidth = collectionView.bounds.width - paddingSpace 
     let widthPerItem = availableWidth/itemsPerRow 

     return CGSize(width: widthPerItem, height: widthPerItem) 
    } 

    func collectionView(_ collectionView: UICollectionView, 
         layout collectionViewLayout: UICollectionViewLayout, 
         insetForSectionAt section: Int) -> UIEdgeInsets { 
     return sectionInsets 
    } 

    func collectionView(_ collectionView: UICollectionView, 
         layout collectionViewLayout: UICollectionViewLayout, 
         minimumLineSpacingForSectionAt section: Int) -> CGFloat { 
     return sectionInsets.left 
    } 
} 

私は何のために行くよする間に非常に小さなスペースで行当たり3個の細胞であるが、私はアプリを実行するたびに enter image description here

ここで、各黒いブロックはセルです。

私が見つけた同様の質問の答えは、通常、私がやったUICollectionViewDelegateFlowLayout関数を実装することです。関数は呼び出されていますが、期待どおりに機能していません!私が手動でwidthPerItemの値をわずかに小さく変更しても、それはまだ動作しません!

ここに明白な何かが欠けていると誰にでも見えますか? ありがとうございました!

答えて

3

アイテム間の最小間隔が1ポイントに設定されていることを確認しましたか?あなたがInterface Builderでか、次のデリゲートメソッドをオーバーライドすることで、これを設定することができ :

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 
    return 1.0; 
} 

私が見るもう一つの可能​​な理由はitemsPerRowavailableWidthを割った結果が浮動数であるということです。結局、セルの幅とインセットの合計は、実際にはコレクションビューの幅を​​3210ピクセル超えている可能性があります。これが起こらないように、floor

func collectionView(_ collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
        sizeForItemAt indexPath: IndexPath) -> CGSize { 
    let paddingSpace = sectionInsets.left * (itemsPerRow + 1) 
    let availableWidth = collectionView.bounds.width - paddingSpace 
    let widthPerItem = floor(availableWidth/itemsPerRow) 

    return CGSize(width: widthPerItem, height: widthPerItem) 
} 
+0

あなたの最初の提案はそれをしました!ありがとう、トン! – user3029918