前提・実現したいこと
collectionViewのカスタムセルをxipファイルで作成し、その中にUIimageViewを配置、
そのUIimageViewにAutoLayoutを設定し、自分が意図したようにレイアウトしたいです!!
###自分の実装方針(現段階)
0. ViewControllerにcollectionViewを配置
0. xipファイルでカスタムcellを作成後、ViewControllerで読み込み
0. Cellの構築は、cellForItemAtで行い(ここで画像を渡します)
Cellのサイズは、UICollectionViewDelegateFlowLayoutのsizeForItemAtで行っています。
0. 2.で作成したカスタムcellの中に、UIImageViewを配置。
0. カスタムcellの領域一杯に表示されるように、UIimageViewに制約を設定。
その制約の中身は、上下左右を0にしています(下部に画像を載せています!!)
以上のような実装方針で**、カスタムCellが、横4列になるように**実装したつもりでした....
発生している問題・エラーメッセージ
ところが、いざ実装してみますと、
UICollectionViewDelegateFlowLayoutのsizeForItemAtで指定したサイズは崩壊し、
画像が本来のサイズ?で表示されてしまい、大きくレイアウトが崩れてしまいます.....
カスタムセル内の、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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/23 05:43
2021/01/23 05:45