質問失礼します。
コードのみでコレクションビューを作成して、カレンダーの枠を作りたいです。
その為にiPadでもiPhoneでも常にセル一行の個数を7個にしたくて下記の様にコードを記載したのですが、
一行に表示されるセルの個数に差が出てしまいます。
どうすればどのデバイスでも横一行の個数を常に7個に出来るのでしょうか。
どなたかご教授いただけると嬉しいです。
よろしくお願い致します。
Swift
1import UIKit 2 3class ViewController: UIViewController { 4 5 //セルに表示させるテキスト 6 let data = ["A","B","C","D","E","F","G","H","I","J","K"] 7 //一列に表示させたいセルの個数 8 let itemsPerRow: CGFloat = 7 9 //コレクションビューとセル全体との幅 10 var sectionInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) 11 //セル同士の間の幅 12 var space: CGFloat = 10 13 14 //コレクションビュー 15 let collectionView :UICollectionView = { 16 let layout = UICollectionViewFlowLayout() 17 //スクロールの方向 18 layout.scrollDirection = .vertical 19 //コレクションビューの設定 20 let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) 21 cv.translatesAutoresizingMaskIntoConstraints = false 22 //カスタムセルを登録する 23 cv.register(CustomCell.self, forCellWithReuseIdentifier: "cell") 24 return cv 25 }() 26 27 28 override func viewDidLoad() { 29 super.viewDidLoad() 30 31 view.backgroundColor = .white 32 33 //コレクションビューをオートレイアウトして表示する 34 view.addSubview(collectionView) 35 collectionView.backgroundColor = .blue 36 collectionView.topAnchor.constraint(equalTo: view.topAnchor, constant: 50).isActive = true 37 collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 50).isActive = true 38 collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -50).isActive = true 39 collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -50).isActive = true 40 41 collectionView.delegate = self 42 collectionView.dataSource = self 43 } 44} 45 46extension ViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDataSource { 47 48 //セルのサイズを設定する 49 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 50 //コレクションビューとセル全体との余白と、セル間のスペースの合計値を足してパディングを算出する 51 let paddingSpace = sectionInsets.left + sectionInsets.right + (space * (itemsPerRow - 1)) 52 //コレクションビューの幅からパディングを引く 53 let availableWidth = collectionView.frame.size.width - paddingSpace 54 //残った幅をセルの個数で割る 55 let widthPerItem = availableWidth / itemsPerRow 56 return CGSize(width: widthPerItem, height: widthPerItem) 57 } 58 59 //セル(全て)とコレクションビューとのスペースの設定 60 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 61 62 return sectionInsets 63 } 64 //セルとセルの横同士の間のスペースを設定する 65 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 66 67 return space 68 } 69 //セルとセルの縦同士の間のスペースを設定する 70 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { 71 72 return space 73 74 } 75 76 //セルの数の設定 77 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 78 79 return data.count 80 } 81 82 //セルの内容の設定 83 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 84 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCell 85 cell.backgroundColor = .gray 86 //カスタムセルの中身に表示させるデータを設定する 87 cell.textLabel.text = self.data[indexPath.row] 88 return cell 89 } 90} 91 92class CustomCell: UICollectionViewCell { 93 //ラベルを設定する 94 var textLabel :UILabel = { 95 let label = UILabel() 96 label.textColor = .blue 97 label.font = UIFont.boldSystemFont(ofSize: 15) 98 label.translatesAutoresizingMaskIntoConstraints = false 99 label.textAlignment = .center 100 label.text = "" 101 return label 102 }() 103 104 override init(frame: CGRect) { 105 super.init(frame: frame) 106 //オートレイアウトしてセルにラベルを表示させる 107 contentView.addSubview(textLabel) 108 textLabel.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true 109 textLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true 110 textLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true 111 textLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true 112 } 113 114 required init?(coder: NSCoder) { 115 fatalError("init(coder:) has not been implemented") 116 } 117} 118 119
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/29 11:21