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

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

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

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

1680閲覧

collectionViewのカスタムセル内におけるAutoLayoutについて

HayashiMasahiro

総合スコア3

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2021/01/23 02:16

前提・実現したいこと

collectionViewのカスタムセルをxipファイルで作成し、その中にUIimageViewを配置、
そのUIimageViewにAutoLayoutを設定し、自分が意図したようにレイアウトしたいです!!

###自分の実装方針(現段階)
0. ViewControllerにcollectionViewを配置
0. xipファイルでカスタムcellを作成後、ViewControllerで読み込み
0. Cellの構築は、cellForItemAtで行い(ここで画像を渡します)
Cellのサイズは、UICollectionViewDelegateFlowLayoutsizeForItemAtで行っています。
0. 2.で作成したカスタムcellの中に、UIImageViewを配置
0. カスタムcellの領域一杯に表示されるように、UIimageViewに制約を設定。
その制約の中身は、上下左右を0にしています(下部に画像を載せています!!)

以上のような実装方針で**、カスタムCellが、横4列になるように**実装したつもりでした....

発生している問題・エラーメッセージ

ところが、いざ実装してみますと、
UICollectionViewDelegateFlowLayoutsizeForItemAtで指定したサイズは崩壊し、
画像が本来のサイズ?で表示されてしまい、大きくレイアウトが崩れてしまいます.....

その有様をご覧下さい!!
イメージ説明

カスタムセル内の、UIimageViewに設定したAutoLayoutのスクショ

イメージ説明

試したこと

AutoLayoutを外しますと、レイアウト自体は崩れないのですが、
今度は、画像が一部しか表示されなくなってしまいます...

イメージ説明

自分の問題点

どうも、カスタムセル内における制約の付け方が、根本的に理解出来ていませんし、
cellのサイズ決定についても、把握できておりません...
なぜ、このような事態になってしまうのか、
ご指導、ご鞭撻のほどよろしくお願いします。

###ソースコード
一部、便宜的に設定してある値もありますが、
処理の体系としては、上に書いた実装方針のつもりです!!

swift

1import UIKit 2import SDWebImage 3 4class ReCategoryShowViewController: UIViewController { 5 6 //MARK:parts======================================= 7 @IBOutlet weak var collectionView: UICollectionView! 8 9 10 //MARK:初回 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 settingUINib() 14 } 15 16 17 //MARK:毎回 18 override func viewWillAppear(_ animated: Bool) { 19 super.viewWillAppear(animated) 20 settingCollectionView() 21 } 22 23 24 //MARK:settings==================================== 25 func settingCollectionView(){ 26 self.collectionView.delegate = self 27 self.collectionView.dataSource = self 28 } 29 30 //MARK:xip 31 func settingUINib(){ 32 let nib1 = UINib(nibName: "CategoryShowHeaderCollectionViewCell", bundle: nil) 33 collectionView.register(nib1, forCellWithReuseIdentifier: "CategoryShowHeaderCollectionViewCell") 34 let nib2 = UINib(nibName: "ReCategoryShowCollectionViewCell", bundle: nil) 35 collectionView.register(nib2, forCellWithReuseIdentifier: "ReCategoryShowCollectionViewCell") 36 } 37} 38 39 40 41//========================================================= 42// UICollectionView Delegate,DataSource 43//========================================================= 44extension ReCategoryShowViewController:UICollectionViewDelegate,UICollectionViewDataSource{ 45 46 //MARK:Section===================================== 47 //MARK:Sectionの数 48 func numberOfSections(in collectionView: UICollectionView) -> Int { 49 return 2 50 } 51 52 53 //MARK:SectionHeader=============================== 54 55 56 57 58 59 60 61 //MARK:Cell======================================== 62 //MARK:Section毎のCellの数 63 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 64 switch section { 65 case 0: 66 return 1 67 default: 68 //MARK:本来、ここは取得した配列の数 69 return 4 70 } 71 } 72 //MARK:Section毎のCellの構築 73 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 74 switch indexPath.section { 75 76 //MARK:Section0 77 case 0: 78 let cell:UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoryShowHeaderCollectionViewCell", for: indexPath) as! CategoryShowHeaderCollectionViewCell 79 return cell 80 81 //MARK:Section1 82 case 1: 83 let cell2 = collectionView.dequeueReusableCell(withReuseIdentifier: "ReCategoryShowCollectionViewCell", for: indexPath) as! ReCategoryShowCollectionViewCell 84 //MARK:Section1 row0 85 if indexPath.row == 0{ 86 let image = UIImage(named: "google") 87 cell2.setUpImage(image: image!) 88 return cell2 89 //MARK:Section1 row1 90 }else if indexPath.row == 1{ 91 let image = UIImage(named: "google") 92 cell2.subliminalTitleImageView.image = image 93 return cell2 94 } 95 return cell2 96 default: 97 let cell:UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "ReCategoryShowSubliminalsCell", for: indexPath) as! CategoryShowHeaderCollectionViewCell 98 return cell 99 } 100 } 101} 102 103 104 105 106 107 108 109 110 111//========================================================= 112// UICollectionView DelegateFlowLayout 113//========================================================= 114extension ReCategoryShowViewController:UICollectionViewDelegateFlowLayout{ 115 //MARK:Section毎のcollectionViewのレイアウト 116 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 117 switch section { 118 case 0: 119 //MARK:画面にCellが張り付く 120 return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) 121 default: 122 //MARK:大枠の余白 123 return UIEdgeInsets(top: 10, left: 5, bottom: 10, right: 5) 124 } 125 } 126 127 //MARK:Section毎のCellのサイズ 128 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 129 var cellWidth:CGFloat = view.frame.size.width 130 print(cellWidth) 131 switch indexPath.section { 132 133 //MARK:Section0(便宜的) 134 case 0: 135 return CGSize(width:200, height: 700) 136 137 //MARK:Section1 138 case 1: 139 //MARK:1/4 140 let horizontalSpace : CGFloat = 5 141 let cellSize:CGFloat = collectionView.bounds.width / 4 - horizontalSpace 142 return CGSize(width: cellSize , height:cellSize) 143 144 default: 145 return CGSize() 146 } 147 } 148 149 //MARK:Section毎の水平方向のCell間のMargin 150 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 151 switch section { 152 case 0: 153 return 0 154 case 1: 155 return 1 156 default: 157 return 1 158 } 159 } 160 161 //MARK:Section毎の垂直方向のCell間のMargin 162 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { 163 switch section { 164 case 0: 165 return 0 166 case 1: 167 return 5 168 default: 169 return 5 170 } 171 } 172 173} 174

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらく、これと同じ様な現象が起きているのだと思います。

ここの回答にある通り、Estimated size を none に設定すれば解決しそうに思えます(ご提示いただいたコードをもとに実行してみたら、やはり none に設定する必要があるようです)。

ただし、ご提示のコードに記載されている、他のセルやヘッダなどに影響がでるかわかりませんので、まずは最小限のコードだけで試されるといいかと思います。

投稿2021/01/23 04:26

TsukubaDepot

総合スコア5086

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

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

HayashiMasahiro

2021/01/23 05:43

ご返答、ありがとうございます!! 早速、試してみます!!!!!
HayashiMasahiro

2021/01/23 05:45

意図した通りにレイアウトできました!!!!!!!!!!!!1 ありがとうございます!!!!!!!!!!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問