์๋ ํ์ธ์! ์ค๋๋ถํฐ ๋ณธ๊ฒฉ์ ์ธ ํํ์ด ์์๋์์ต๋๋ค๐
ํ์๋ค๊ณผ ์นดํ ์ฑ์ ๋ง๋ค์ด ๋ณด๊ธฐ๋ก ํ์ด์~!
ํ์๋ค๊ณผ ์์นจ๋ถํฐ UI๋ฅผ ์ง๊ณ , ์ด๋ค ๊ธฐ๋ฅ์ ๊ตฌํํ ์ง์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๋๋ ํ์
์ญํ ์ ๋๋๊ณ ๋ณธ๊ฒฉ์ ์ธ ๊ตฌํ์ ๋ค์ด๊ฐ์ต๋๋ค.
์ ๋ ํ๋ฒ๋ ์ฌ์ฉํด๋ณด์ง ์์ CollectionView๋ฅผ ๋ง์ ธ๋ณด๊ณ ์ถ์ด์
์ ๊ทน์ ์ผ๋ก ํ๊ณ ์ถ๋ค๋ ์๊ฒฌ์ ๋ด์์ด์!!
๊ฐ์ฌํ๊ฒ๋ ๋ค๋ฅธ ํ์๋ถ์ด ์๋ณด๋ฅผ ํด์ฃผ์ ์ CollectionView ํํธ๋ฅผ ๋งก๊ฒ ๋์์ต๋๋ค~!
CollectionView
CollectionView๋ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ์ View๋ค์ ์นด๋ํ์์ผ๋ก ๋์ดํ ์ ์๋ ๋ทฐ์ ๋๋ค.
TableView์ ๋น์ทํ๊ฒ Delegate์ DataSouce๋ฅผ ์ฑํํ์ฌ CollectionView Cell๊ณผ CollectionView๊ฐ ์๋ก ์ํต์ ํ๋ ํ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ผ๊ตฌ์!
UICollectionViewDataSource ํ๋กํ ์ฝ
์ CollectionView ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๋ฉ์๋์ ํด๋น ๋ฐ์ดํฐ๋ฅผ CollectionView์ ํ์ํ๋ ๋ฉ์๋๋ค์ ๋ค๋ฃน๋๋ค.
[ ๊ด๋ จ๋ ํจ์ ]
- collectionView(_:numberOfItemsInSection: ) : CollectionView์ ํ์ํ Section์ ์ํ cell์ ๊ฐ์ ๋ฐํ
- collectionView(_:cellForItemAt: ) : ํน์ ์์น์ ํ์ํ cell ๋ฐํ ( cell์ ์ด๊ธฐํํ๊ณ data๋ฅผ ์ค์ ํจ )
UICollectionViewDelegate ํ๋กํ ์ฝ
์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๊ด๋ จ๋ ์์ ์ ์ํํ๋ ๋ฉ์๋๋ฅผ ๋ค๋ค์. ์๋ฅผ ๋ค๋ฉด, CollectionView์ ๋ ์ด์์ ์ค์ ์ด๋ cell์ด ์ ํ๋ ํ์ ๋์, scroll์ด๋ animation ๊ด๋ฆฌ ๋ฑ์ด ์์ฃ .
[ ๊ด๋ จ๋ ํจ์ ]
- collectionView(_:didSelectItemAt:) : ํน์ cell์ ์ ํํ์ ๋ ํธ์ถ
- collectionView(_:didDeselectItemAt:) : ์ ํํ cell์ ์ ํํด์ ํ์ ๋ ํธ์ถ
- collectionView(_:willDisplay:forItemAt:) : ํน์ cell์ ํ์ํ๊ธฐ ์ ์ ํธ์ถ
- collectionView(_:didEndDisplaying:forItemAt:) : ํน์ cell์ด ํ๋ฉด์์ ์ฌ๋ผ์ง ํ ํธ์ถ
CollectionView๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ ๋ ํ๋กํ ์ฝ์ ๋ฐ๋์ ์ฑํํ์ฌ์ผ ํฉ๋๋ค.
๋ํ ํ์ ์ฑํ์ ์๋์ง๋ง, ๊ตฌํ์ ์์ด์ ํ์ํ ํ๋กํ ์ฝ๋ ์๊ฐํด ๋๋ฆด๊ฒ์!
UICollectionViewDelegateFlowLayout ํ๋กํ ์ฝ
์ CollectionView์ ๋ ์ด์์๊ณผ ๊ด๋ จ๋ ๋ถ๋ถ๋ค์ ์ ์ดํ ์ ์์ด์. cell์ ํฌ๊ธฐ๋ ๊ฐ๊ฒฉ ๋๋ ๊ทธ๋ฆฌ๋์ ํฌ๊ธฐ๋ ๊ฐ๊ฒฉ ๋ฑ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
[ ๊ด๋ จ๋ ํจ์ ]
- collectionView(_:layout:sizeForItemAt:) : ๊ฐ๋ณ ์ ์ ํฌ๊ธฐ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
- collectionView(_:layout:insetForSectionAt:) : Section์ ์ฌ๋ฐฑ์ ๋ฐํํ๋ ๋ฉ์๋
- collectionView(_:layout:minimumLineSpacingForSectionAt:) : Section์ ์ค ๊ฐ๊ฒฉ์ ๋ฐํ
- collectionView(_:layout:minimumInteritemSpacingForSectionAt:) : Section์ ํญ๋ชฉ ๊ฐ๊ฒฉ์ ๋ฐํ
- collectionView(_:layout:referenceSizeForHeaderInSection:) : Header์ ํฌ๊ธฐ๋ฅผ ๋ฐํ
- collectionView(_:layout:referenceSizeForFooterInSection:) : Footer์ ํฌ๊ธฐ๋ฅผ ๋ฐํ
์ ๋ ์ค๋ ์ฌ๊ธฐ์ 4๊ฐ์ง ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํด์ฃผ์์ต๋๋ค.
CollectionView ๊ตฌํ
[ ViewController ]
1. ์คํ ๋ฆฌ ๋ณด๋์์ CollectinoView ์คํ ๋ ์ด์์ ์ก๊ธฐ
2. CollectionViewCell ํ์ผ ์์ฑํ์ฌ CollectionCell์ ์ฐ๊ฒฐํ๊ธฐ
3. ํ๋กํ ์ฝ ์ฑํ
extension MenuListViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
}
4. delegate์ datasource ๋ชฉ์ ์ง ์๊ธฐ ์์ ์ผ๋ก ์ค์
// collectionView setting
func setCollectionView() {
menuCollectionView.dataSource = self
menuCollectionView.delegate = self
}
์์ ํจ์๋ viewDidLoad์ ๋ฃ์ด์ฃผ์์ต๋๋ค!
5. collectionView์ ๋ฐํํ cell์ ๊ฐ์ ๋ฆฌํดํ๊ธฐ
// collectionView cell ๊ฐ์
func collectionView(_ collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return menuData.count
}
6. collectionView์ cell ์ฐ๊ฒฐํ๊ณ , Data ์ ๋ฌํ๊ธฐ
// collectionView์ cell ์ฐ๊ฒฐ / menuData ์ ๋ฌ
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MenuCell", for: indexPath) as? MenuListCollectionViewCell else {
return UICollectionViewCell()
}
cell.setConfigue(menuData[indexPath.row])
return cell
}
7. collectionView ํน์ cell ์ ํ์ cart์ ๋ฐ์ดํฐ ์ถ๊ฐํ๊ธฐ
// collectionView ์ ํ์ cart์ ์ถ๊ฐ
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
cartDataManager.addCartData(name: menuData[indexPath.row].name)
}
8. collectionView์ view ์ฌ์ด์ฆ ์ค์ ํ๊ธฐ
// collectionView์ view ์ฌ์ด์ฆ ์ค์
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 170, height: 170)
}
9. collectionView์ ํ ๊ฐ๊ฒฉ ์ค์ ํ๊ธฐ
// collectionView์ ํ ๊ฐ๊ฒฉ ์ค์
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 17
}
[ CollectionViewCell ]
1. cell์ ์คํ ๋ฆฌ๋ณด๋์ @IBOutlet ์ฐ๊ฒฐํ๊ธฐ
@IBOutlet weak var menuImageView: UIImageView!
@IBOutlet weak var menuPriceLabel: UILabel!
@IBOutlet weak var menuNameLabel: UILabel!
2. ๋ฐ์ ๋ฐ์ดํฐ๋ก ๋ฉ๋ด ์ด๋ฏธ์ง, ๋ฉ๋ด ๊ฐ๊ฒฉ, ๋ฉ๋ด ์ด๋ฆ ์ค์ ํ๊ธฐ
func setConfigue(_ data: MenuData){
// ์ด๋ฏธ์ง๊ฐ ์๋ค๋ฉด ์ค์
if let image = data.image {
menuImageView.image = image
}else {
menuImageView.image = UIImage(named: "mug")
menuImageView.tintColor = .black
}
// ๋ฉ๋ด ๊ฐ๊ฒฉ ์ค์
menuPriceLabel.text = String(data.price) + "์"
// ๋ฉ๋ด ์ด๋ฆ ์ค์
menuNameLabel.text = data.name
}
3. contentView์ ํ ๋๋ฆฌ ์ค์ ํ๊ธฐ
// ํ
๋๋ฆฌ ์ค์
// ๋ฅ๊ทผ ๋ชจ์๋ฆฌ
contentView.layer.cornerRadius = 16
contentView.clipsToBounds = true
// ๊ฒฝ๊ณ์ ํฌ๊ธฐ
contentView.layer.borderWidth = 1
// ๊ฒฝ๊ณ์ ์๊น
contentView.layer.borderColor = UIColor(red: 128/255, green: 202/255, blue: 255/255, alpha: 1.0).cgColor
๊ตฌํ ํ๋ฉด
์ฐ์ ์ ์๊ฒ ์ฃผ์ด์ง ์๋ฌด๋ ์๋ฃํ ๊ฒ ๊ฐ์ต๋๋ค!!ใ ใ
์ปฌ๋ ์ ๋ทฐ ์ ์ด์ง ํฉ๋๋ค! ๋ผ๊ณ ๋งํ๊ณ ์ถ์ง๋ง, ์ค๋ ํฌ๋ํฐ ์ค๋ฅ์ ๋งํ์์ด์..
์ค๋ฅ ํด๊ฒฐ ๊ณผ์
Thread 1: "[<UICollectionViewCell 0x105c08420> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key menuBackgroundView."
ํด์ํด๋ณด๋ ์ด ํด๋์ค ( UICollectionViewCell )์ menuBackgroundView ์ ๋ํ key value Colding-compliant๊ฐ ์๋๋์..
1์๊ฐ์ ๋์ ์ฝ์ง ํ์ ์ด๊ฒ ์ ๊ฒ ๋ค ๋ง์ ธ๋ณด๋ค๊ฐ ์์๋ธ ์ฌ์ค์ ์ ๊ฐ ์ Module๊ฐ์ ์ญ์ ํ๋๋ผ๊ตฌ์.. Class๋ฅผ ๋ณ๊ฒฝํ๋ค๊ฐ ์๋ชป ๋๋ฌ์ ์๋ ๋น์ด์๋ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ง์ฐ๊ณ ๋น ์ ธ๋์๋๋ฐ,, ์๊ณ ๋ณด๋ ์ Module์ ์ด Class๊ฐ ์กด์ฌํ๋ ์์น๋ฅผ ์ด์ผ๊ธฐํ๊ณ ์๋ ๊ฑฐ๋๋ผ๊ตฌ์! ๊ทธ๋ ๊ฒ ํด๊ฒฐํ์ต๋๋ค.. ํ.. ์ด๋ฒ์ ์ฝ์งํ์ผ๋ ๋ค์๋ฒ์ ๋ฐ๋ก ์ ์ ์๊ฒ ์ฃ ?!ใ
Module์ ํ๋ ์์ํฌ๊ฐ ์ฑ์ ๋ ๋ฆฝ์ ์ธ ๋ถ๋ถ์ ๋ํ๋ ๋๋ค. Class์ ์ด๋ฆ์ด ๋ฌด์ํ ๋ง์ง๋ง ํด๋น Module์ ์ํ class๋ ๋จ ํ ๊ฐ์ด๋ฏ๋ก Xcode๊ฐ ์ด๋ MenuListCollectionView์ธ์ง ์ ๊ตฌ๋ถํด๋ผ ์ ์๊ฒ ์ฃ ! "Inherit Module From Target" ๋ผ๋ ์ต์ ์ ํด๋น ํด๋์ค๊ฐ ์ํ ๋ชจ๋์ด๋ ํ๊ฒ์ ์์ํ๋ค๋ ์๋ฏธ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ฑธ ์ฒดํฌํ๋ฉด ์ง๊ธ ํ์ฌ ์ํด์๋ Module ์์์์ Class๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๋ฏ๋ก ์ฒดํฌํด์ ํ๋ค๋ฉด ๋น์ฐํ ์ค๋ฅ๊ฐ ๋๊ฒ ์ฃ ..!