📌 일곱번째 프로젝트
NRC Onboarding 앱을 만들어보자
1️⃣ Data 확인 및 SearchViewController 만들기
- 이전 프로젝트들과 마찬가지로 패캠에서 제공해준 데이터들을 사용
- "OnboardingViewController" 이름의 UIViewController을 만들어서, Main storyboard와 연결까지 완료
2️⃣ 배경이미지 넣기
- 배경 이미지는 Assest에 있음
3️⃣ StackView를 이용하여 하단에 버튼 넣기
4️⃣ Page Control + Collection View
- View에 수평방향 맞게하고, StackView와의 vertical 거리는 40으로!
5️⃣ UICollectionViewCell 만들기
- "OnboardingCell" 이라는 이름으로!
- CollectionViewCell과 연결 , 재사용 cell도 설정
// OnboardingCell.swift
import UIKit
class OnboardingCell: UICollectionViewCell {
// component 연결
@IBOutlet weak var thumbnailImageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var descriptionLabel: UILabel!
// 데이터 연결
func configure(_ message: OnboardingMessage){
thumbnailImageView.image = UIImage(named: message.imageName)
titleLabel.text = message.title
descriptionLabel.text = message.description
}
}
6️⃣ View Controller까지 코드 중간 완성
//
// OnboardingViewController.swift
// NRC Onboarding
//
// Created by 오예진 on 2022/05/30.
//
import UIKit
class OnboardingViewController: UIViewController {
// collectionView 연결
@IBOutlet weak var collectionView: UICollectionView!
// 메세지 가져오기
let messages: [OnboardingMessage] = OnboardingMessage.messages
override func viewDidLoad() {
super.viewDidLoad()
collectionView.dataSource = self
collectionView.delegate = self
if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
layout.estimatedItemSize = .zero
}
}
}
extension OnboardingViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return messages.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "OnboardingCell", for: indexPath) as? OnboardingCell else{
return UICollectionViewCell()
}
// messages에서 item을 가져와서 cell을 구성
let message = messages[indexPath.item]
cell.configure(message)
return cell
}
}
extension OnboardingViewController: UICollectionViewDelegateFlowLayout {
}
아래로 스크롤 되는 collection view
7️⃣ cell이 좌우 스크롤 되도록 바꾸기
8️⃣ 페이징 느낌나게 바꾸기 + Indicator 도 없애기
페이징 느낌 + Indicator 없앰
이후 description 중앙 정렬까지 완료해줬음
9️⃣ cell 사이즈 조정하기
// OnboardingViewController.swift
//...
extension OnboardingViewController: UICollectionViewDelegateFlowLayout {
// cell 사이즈 조정
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
// cell과 collectionView의 사이즈가 같음
return collectionView.bounds.size // size 프로퍼티 안에 width, height 모두 있음.
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return .zero
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return .zero
}
}
그랬더니 아주 깔꼼하게 넘겨지는 cell들..!
🔟 Page Control 연결
- View Controller에 Page Control을 연결
// OnboardingViewController.swift
import UIKit
class OnboardingViewController: UIViewController {
//...
// pageControl 연결
@IBOutlet weak var pageControl: UIPageControl!
override func viewDidLoad() {
// ...
// 페이지 개수 ( 동그란 점의 개수 )
pageControl.numberOfPages = messages.count
}
}
extension OnboardingViewController: UIScrollViewDelegate {
// func scrollViewDidScroll(_ scrollView: UIScrollView) {
// // 페이지 구하는 식
// print(Int(scrollView.contentOffset.x / self.collectionView.bounds.width))
// }
// 페이지가 움직이다가 멈췄을 때 실행되는 함수
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// 위에서 페이지 구하는 식 가져오기
let index = Int(scrollView.contentOffset.x / self.collectionView.bounds.width)
// 이 index를 currentPage에 업데이트!
pageControl.currentPage = index
}
}
🚀 구현완료!
📌 정리,
- Scroll Direction = Horizontal : collectionView가 좌우로 스크롤 되도록 바꿈
- PageControl을 CollectionView와 연결
- PageControl.numberOfPages : 페이지 개수
- UICollectionView는 UIScrollView의 특성을 가지고 있음
- UIScrollViewDelegate의 scrollViewDidEndDecelerating : 페이지를 움직이다가 멈췄을 때마다 실행되는 함수
- 여기에 index를 계산하고 pageControl.currentPage에 할당해주면 Page와 CollectionView의 아이템이 연결됨!
- UIScrollViewDelegate의 scrollViewDidEndDecelerating : 페이지를 움직이다가 멈췄을 때마다 실행되는 함수
Reference
패스트캠퍼스 온라인 강의
'iOS > Toy project' 카테고리의 다른 글
[iOS : Toy Project] Head Space Focus (0) | 2022.06.07 |
---|---|
[iOS : Toy Project] Diffable DataSource, Compositional Layout을 이용해 프로젝트 개선하기 (0) | 2022.06.04 |
[iOS : Toy Project] Insta Search View (2) (0) | 2022.05.29 |
[iOS : Toy Project] Insta Search View (1) (0) | 2022.05.29 |
[iOS : Toy Project] Apple Framework List (2) (0) | 2022.05.28 |