質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1163閲覧

コレクションビューの一行に表示されるセルの個数を一定にしたい

Ka_ya_

総合スコア31

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/29 09:12

質問失礼します。

コードのみでコレクションビューを作成して、カレンダーの枠を作りたいです。
その為に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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

swift

1//セルとセルの横同士の間のスペースを設定する 2func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 3 return space / 2 4}

たしかこれで動いたと思います…。理由はご自身で確認されてみてください。

投稿2020/05/29 10:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ka_ya_

2020/05/29 11:21

tyobigorouさん、いつもご回答ありがとうございます。 セル間のスペースが両サイドに適応されるから計算にズレが生じていたんですね…! 留意してスペースの最小サイズを設定したところ、 ちゃんと両デバイスでセルの個数が一致しました。 ご回答ありがとうございました^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問