📌 다섯번째 프로젝트 (1)
Apple Framework List 앱을 만들어보자
1️⃣ Data 확인 및 FrameworkViewController 만들기
- 이전 프로젝트들과 마찬가지로 패캠에서 제공해준 데이터들을 사용
- "FrameworkViewController" 이름의 UIViewController을 만들어서, Main storyboard와 연결까지 완료
2️⃣ Auto Layout
3️⃣ UICollectionViewCell 만들기
//
// FrameworkCell.swift
// AppleFrameWork
//
// Created by 오예진 on 2022/05/27.
//
import UIKit
class FrameworkCell: UICollectionViewCell {
@IBOutlet weak var thumbnailImageView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
// cell을 업데이트 해줄 수 있는 method 추가
func configure(_ framework: AppleFramework){
thumbnailImageView.image = UIImage(named: framework.imageName)
nameLabel.text = framework.name
}
}
4️⃣ ViewController에 CollectionView 세팅
- DataSource와 Delegate 설정
//
// FrameworkListViewController.swift
// AppleFrameWork
//
// Created by 오예진 on 2022/05/27.
//
import UIKit
class FrameworkListViewController: UIViewController {
// CollectionView 자체를 연결
@IBOutlet weak var collectionView: UICollectionView!
// 데이터를 일단 가져오기
let list: [AppleFramework] = AppleFramework.list
// Data, Presentation, Layout
override func viewDidLoad() {
super.viewDidLoad()
// DataSource는 ViewController 자신에게 물어보기(self)
collectionView.dataSource = self
// delegate를 통해서 Layout도 잘 위임
collectionView.delegate = self
}
}
// dataSource 프로토콜 준수 과정
extension FrameworkListViewController:
UICollectionViewDataSource {
// 몇개나 cell에 보여줄 건지?
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return list.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FrameworkCell", for: indexPath) as? FrameworkCell else{
return UICollectionViewCell()
}
return cell
}
}
// delegate 프로토콜 준수 과정
extension FrameworkListViewController: UICollectionViewDelegateFlowLayout {
// collectionView size를 automatic -> none 으로 바꿔주기
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
// item들간의 간격
let interItemSpacing: CGFloat = 10
let width = (collectionView.bounds.width - interItemSpacing * 2) / 3
let height = width * 1.5
return CGSize(width: width, height: height)
}
}
5️⃣ Data 업데이트 : 캐스팅!
//
// FrameworkListViewController.swift
// AppleFrameWork
//
// Created by 오예진 on 2022/05/27.
//
import UIKit
class FrameworkListViewController: UIViewController {
// CollectionView 자체를 연결
@IBOutlet weak var collectionView: UICollectionView!
// 데이터를 일단 가져오기
let list: [AppleFramework] = AppleFramework.list
// Data, Presentation, Layout
override func viewDidLoad() {
super.viewDidLoad()
// DataSource는 ViewController 자신에게 물어보기(self)
collectionView.dataSource = self
// delegate를 통해서 Layout도 잘 위임
collectionView.delegate = self
}
}
// dataSource 프로토콜 준수 과정
extension FrameworkListViewController:
UICollectionViewDataSource {
// 몇개나 cell에 보여줄 건지?
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return list.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FrameworkCell", for: indexPath) as? FrameworkCell else{
return UICollectionViewCell()
}
let framework = list[indexPath.item] // 몇번째 아이템을 가져올건지는 index.item을 통해 가져올 수 있다.
cell.configure(framework)
return cell
}
}
// delegate 프로토콜 준수 과정
extension FrameworkListViewController: UICollectionViewDelegateFlowLayout {
// collectionView size를 automatic -> none 으로 바꿔주기
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
// item들간의 간격
let interItemSpacing: CGFloat = 10
let width = (collectionView.bounds.width - interItemSpacing * 2) / 3
let height = width * 1.5
return CGSize(width: width, height: height)
}
// cell 사이의 간격
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 10
}
// 윗줄과 아랫줄 (line spacing) 간의 간격
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 10
}
}
6️⃣ 네비게이션 바
- storyboard > Editor > Embed In > Navigation Controller
7️⃣ 보완
- 윗부분 블러처리 및 둥근 엣지따라 items가 다 보이게 하기
-> top도 bottom과 마찬가지로 설정해주기
엣지에 따라 잘!
- contentInset을 통해 콘텐츠의 안쪽 여백 주기
override func viewDidLoad() {
super.viewDidLoad()
// DataSource는 ViewController 자신에게 물어보기(self)
collectionView.dataSource = self
// delegate를 통해서 Layout도 잘 위임
collectionView.delegate = self
// contentInset = Content의 안쪽 여백 주기
collectionView.contentInset = UIEdgeInsets(top: 20, left: 16, bottom: 0, right: 16)
}
- width 조절까지 다시 마무리
// 좌우로 들어가는 16짜리 padding
let padding: CGFloat = 16
let width = (collectionView.bounds.width - interItemSpacing * 2 - padding * 2) / 3
- collectionView의 Estimate Size를 None으로 해줬던 것을 코드로 구현해보기 : collectionViewLayout 프로퍼티 -> 캐스팅!
override func viewDidLoad() {
super.viewDidLoad()
collectionView.dataSource = self
collectionView.delegate = self
// collectionView의 estimate size를 none으로 설정하는 코드
if let flowlayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout{
flowlayout.estimatedItemSize = .zero // .zero 는 none으로 설정해준것과 같다.
}
collectionView.contentInset = UIEdgeInsets(top: 20, left: 16, bottom: 0, right: 16)
}
🚀 구현 완료!
📌 정리,
- item들 간의 간격과 안쪽 padding을 고려하여 cell의 width 계산
- contentInset 프로퍼티를 통한 Content의 안쪽 여백 할당
- minimumInteritemSpacingForSectionAt : cell 사이의 간격
- minimumLineSpacingForSectionAt : 윗줄과 아랫줄 간의 간격 (line spacing)
- 네비게이션 바 추가❗️
Reference
패스트캠퍼스 온라인 강의
'iOS > Toy project' 카테고리의 다른 글
[iOS : Toy Project] Insta Search View (1) (0) | 2022.05.29 |
---|---|
[iOS : Toy Project] Apple Framework List (2) (0) | 2022.05.28 |
[iOS: Toy Project] Chat List (0) | 2022.05.23 |
[iOS : Toy Project] Stock Rank (0) | 2022.05.21 |
[iOS : Toy Project] Simple Weather (0) | 2022.05.17 |