web-dev-qa-db-ja.com

完全に静的なUICollectionViewは可能ですか?

UITableViewでは、完全に静的なtableView構成が可能です。 UITableViewのデータソースを切断し、IBを使用して各セルをストーリーボード(またはxib)に配置できます。

UICollectionViewでも同じことを試しました。 UICollectionViewのデータソースを切断します。各セルをストーリーボードのUICollectionViewに配置します。エラーなしでビルドしました。しかし、それはうまくいきませんでした。セルはまったく表示されませんでした。

データソースのないUICollectionViewは可能ですか?

27
kmugitani

番号。

静的UICollectionViewControllerの作成は許可されていません。データソースデリゲートが必要です。

また、静的UITableViewではなく、静的UITableViewControllerがあることも指摘しておきます。それは違いです。

17
AShavit

静的なUICollectionViewControllerを簡単に作成できます。

インターフェースビルダーですべてのセルを作成し、それらに再利用識別子(「Home_1」「Home_2」「Home_3」など)を付与し、次のようにメソッドに入力するだけです。

class HomeViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {  
    let cellIdentifiers:[String] = ["Home_1","Home_2","Home_3"]
    let sizes:[CGSize] = [CGSize(width:320, height:260),CGSize(width:320, height:160),CGSize(width:320, height:100)]

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return cellIdentifiers.count
    }
    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        return collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifiers[indexPath.item], for: indexPath)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return sizes[indexPath.item]
    }
}

次に、ビューコントローラーを適切なクラスに設定し、(基本的に)静的なコレクションに設定します。申し訳ありませんが、コントロールのグループがある場合、これは縦方向と横方向のビューをサポートするための最良の方法です...

15
Daniel Kanaan

少し実験を行い、独自のメソッドを追加したいと思っていました。それが、探していた本当に静的で高度にカスタム化されたコレクションビューを実現するのに役立ちました。

次のように、コレクションビューに表示するセルごとにカスタムUICollectionViewCellsを作成し、コレクションビューのすべてのセルIDにそれらを登録できます。

静的セルを作成します。

class MyRedCell: UICollectionViewCell {
    override init(frame: CGRect) {
        super.init(frame: frame)
        contentView.backgroundColor = .red
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

好きなだけ作成してください。

次に、コレクションビューコントローラーに戻り、それらを対応するcellIdに登録します。

let cellIds = ["redCell","blueCell","greenCell"]

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.register(MyRedCell.self, forCellWithReuseIdentifier: "redCell")
    collectionView.register(MyBlueCell.self, forCellWithReuseIdentifier: "blueCell")
    collectionView.register(MyGreenCell.self, forCellWithReuseIdentifier: "greenCell")
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIds[indexPath.item], for: indexPath)

    return cell
}

各セルには、クラスの内容が正確に表示されます。

0
Tim Isenman