すみません、セルの動的生成を制御する簡単な方法は出てきませんでした...
代替策として、コレクションビューのスクロール位置からセルインデックスを求めてみたのですが、これでなんとかなりますでしょうか?
###CollectionViewCell.swift
コレクションビューに表示するカスタムセル
中央にインデックス表示用のラベルを配置
dequeueReusableCell
用の名前は「cell」とした
swift
1import UIKit
2
3class CollectionViewCell: UICollectionViewCell {
4
5 @IBOutlet weak var indexLabel: UILabel! // セル内のインデックス表示用ラベル
6
7}
8
###ViewController.swift
メインのビューコントローラ
コレクションビューと、コレクションビュー外のインデックス表示用ラベルを配置
UICollectionViewDataSource
とUICollectionViewDelegate
プロトコルを実装してコレクションビューのソース・デリゲートと接続
swift
1import UIKit
2
3class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
4
5 @IBOutlet weak var collectionView: UICollectionView! // コレクションビュー
6 @IBOutlet weak var indexLabel: UILabel! // コレクションビュー外のインデックス表示用ラベル
7
8 var currentIndex = -1 // 現在のインデックス
9
10 // コレクションビューのスクロールオフセットにコレクションビューの中心点分のオフセットを加算、その位置にあるセルのインデックスを返す
11 // とりあえず、どのセルもビュー中心になければrowを-1にした
12 var currentCellIndexPath : IndexPath {
13 get {
14 let offset = self.collectionView.contentOffset
15 let frameSize = self.collectionView.frame.size
16 let centerX = frameSize.width * 0.5
17 let centerY = frameSize.height * 0.5
18
19 return collectionView.indexPathForItem(at: CGPoint(x: centerX + offset.x, y:centerY + offset.y)) ?? IndexPath(row: -1, section: 0)
20 }
21 }
22
23 // ロード時にコレクションビュー外ラベルに現在のインデックスをセット
24 override func viewDidLoad() {
25 super.viewDidLoad()
26
27 self.setIndexLabelText()
28 }
29
30 override func didReceiveMemoryWarning() {
31 super.didReceiveMemoryWarning()
32 }
33
34 // とりあえずセル数を10個にした
35 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
36 return 10
37 }
38
39 // セル要求が来たらセルのラベルにインデックスをセットして返す
40 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
41 let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
42
43 cell.indexLabel.text = String(indexPath.row)
44
45 return cell
46 }
47
48 // コレクションビューのスクロールが発生するたび、コレクション外のビューにインデックスをセット
49 func scrollViewDidScroll(_ scrollView: UIScrollView) {
50 self.setIndexLabelText()
51 }
52
53 // コレクションビュー外ラベルへのインデックスのセットはひとまとめにメソッドにした
54 private func setIndexLabelText() {
55 let index = self.currentCellIndexPath.row
56
57 // インデックスが負(どのセルも指していない)の時と、現在のインデックスに変化がない時は何もしない
58 if ((index >= 0) && (index != self.currentIndex)) {
59 self.currentIndex = index
60 self.indexLabel.text = String(index)
61 }
62 }
63}
###実行時の様子
文字に色を付けたりしてみました。