์ ๋ ์ปค๋ฆฌํ๋ผ ๋ฉ์ธ๋ทฐ(์ผ์ชฝ ์ฌ์ง)์ ์ฃผ์ฐจ๋ณ ๋ฆฌ์คํธ๋ทฐ(์ค๋ฅธ์ชฝ ์ฌ์ง)๋ฅผ ๋งก์์ต๋๋ค.
์ปค๋ฆฌํ๋ผ๋ทฐ๋ฅผ ๋ณด๋ฉด API ๋คํธ์ํฌ ํต์ ์ ํด์ ์ ์ ์ ์ฃผ์ฐจ, ์ผ์, D-Day, ๋ก๋ (LottieAnimationView
)์ progress ์ ๋ณด๋ฅผ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ก๋ ์๋์ ํ
์ด๋ธ ๋ทฐ๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ์ฒ์ ์ปค๋ฆฌํ๋ผ ๋ทฐ์ ๋ค์ด ์์ ๋, ์ ์ ์ฃผ์ฐจ์ ํด๋นํ๋ cell์ ๊ฐ์ฅ ์๋จ์ ๋ณด์ฌ์ฃผ๊ณ ์์ ์๋ ๋ด์ฉ์ ํผ์ณ์ ๋ณด์ฌ์ฃผ์ด์ผ ํ์ต๋๋ค. ๋ฐ์์จ ์ ์ ์ ํด๋น ์ฃผ์ฐจ์ ๋ฐ๋ผ scrollToRow๋ฅผ ์ฌ์ฉํด ์๋จ์ ์์นํ๋๋ก ํ์ต๋๋ค. ๋ํ cell์ด ํผ์ณ์ ธ ์๋ ๊ฒ์ ๊ตฌํํ๊ธฐ ์ํด cell์ ์ ๋ณด๋ค์ stackView์์ ๋ฃ์ด์ stackView๋ฅผ isHidden ์ํค๋ฉด์ expandable cell์ ๊ตฌํํ์ต๋๋ค. ๋ํ ํผ์ณ์ ธ ์๋ cell์ ์ฃผ์ฐจ๋ผ๋ฒจ์ ๋นจ๊ฐ๊ฒ ํด์ฃผ์์ต๋๋ค. ๋ํ ํผ์ณค์ ๋ ์ด๋ฏธ์ง ์์ ์๋ ๋ฒํผ์ ํตํด โ์ฃผ์ฐจ๋ณ ๋ฆฌ์คํธโ๋ทฐ๋ก ์ด๋์์ผฐ์ต๋๋ค. cell์์ ์์ด์ delegate๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
์ปค๋ฆฌํ๋ผ๋ทฐ์์ ์ํ๋ ์ฃผ์ฐจ๋ฅผ ์ ํํด์ ์ฃผ์ฐจ๋ณ ๋ฆฌ์คํธ๋ทฐ๋ก ๋์ด์ต๋๋ค. ์ด ๋ทฐ๋ ์ ์ฒดํ๋ฉด์ด ์ ์์ผ๋ก ๋์ด๊ฐ์ผ ๋๊ธฐ ๋๋ฌธ์ ์ปฌ๋ ์ ๋ทฐ ์์ ํ ์ด๋ธ๋ทฐ๋ฅผ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ํ์ต๋๋ค. ํค๋๋ทฐ๋ฅผ ๋ฐ๋ก ๋ฃ์ง ์๊ณ ํค๋๋ทฐ๋ฅผ row0์ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ต๋๋ค. ์ด ๋ทฐ์์๋ API๋ก ์ํฐํด ์ ๋ณด๋ค์ ๊ฐ์ ธ์ ํ ์ด๋ธ๋ทฐ cell์ ๋ฟ๋ ค์ฃผ์์ต๋๋ค. ๋ํ API ์ฐ๊ฒฐํด์ ๋ถ๋งํฌ ๋ฒํผ ๊ธฐ๋ฅ๋ ๊ตฌํํ์ต๋๋ค. ๋ํ ํ๊ทธ๊ฐ๋ค์ด ๋ฐฐ์ด๋ก ๋ค์ด์์ ๊ฐ ํ๊ทธ ์ค๊ฐ์ค๊ฐ์ join์ผ๋ก ์ ์ ๋ฃ์ด์ฃผ์์ต๋๋ค. ๋ํ ์ฒ์ ์ฃผ์ฐจ๋ณ ๋ฆฌ์คํธ๋ทฐ์ ์ฒ์ ๋ค์ด ์์ ๋, ์ปค๋ฆฌํ๋ผ๋ทฐ์์ ์ ์ ๊ฐ ์ ํํ ์ฃผ์ฐจ์ item์ผ๋ก ๋ฐ๋ก ๋์ด๊ฐ์ผ๋๊ธฐ ๋๋ฌธ์ scrollToItem์ ์ฌ์ฉํ์ต๋๋ค.
์ด๋ฏธ์ง์ ํฌ๊ธฐ์ ๋ํ ๊ธฐ๊ธฐ ๋์์ ์ํด ๊ฐ๋ก,์ธ๋ก ๋น์จ์ ๊ณ์ฐํ ๋ multipliedBy์์์ ์ฐ์ฐ์ด ๋์ง ์์์ ๋ฐ๋ก ๋นผ์ฃผ์ด์ ๊ณ์ฐํด์คฌ์ต๋๋ค.
private enum Size {
static let contentImageView: CGFloat = 120 / 335
}
contentImageView.snp.makeConstraints{
$0.height.equalTo(contentImageView.snp.width).multipliedBy(Size.contentImageView)
}
func toggleButtonTapped(indexPath: IndexPath?) {
self.isFirstPresented = false
guard let indexPath else { return }
let previousWeekDatas = curriculumViewDatas[indexPath.section].weekDatas[indexPath.row]
curriculumViewDatas[indexPath.section].weekDatas[indexPath.row].isExpanded = !previousWeekDatas.isExpanded
curriculumTableView.reloadRows(at: [indexPath], with: .automatic)
}
๋ฒํผ์ด cell์ ์๊ธฐ ๋๋ฌธ์ delegate๋ก ๋นผ์ฃผ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ cell์ ๋ง๋ค ๋, indexPath๋ฅผ ๋๊ฒจ์ฃผ๊ณ , ํ ๊ธ๋ฒํผ์ ๋๋ ์ ๋, ๊ทธ ํด๋น ๋ฒํผ์ด ์๋ indexPAth๋ฅผ ๊ฐ์ด ๋๊ฒจ์ฃผ์์ต๋๋ค. ๋ํ expand๋ row๋ฅผ ๋ฆฌ๋ก๋ํด์ฃผ์์ต๋๋ค.
func scrollToUserWeek() {
guard let userInfoData else { return }
let userWeek = userInfoData.userWeekInfo
if userWeek == 40 {
let weekPerMonth = 4
let desireSection = (userWeek / weekPerMonth) - 2
let desireRow = (userWeek % weekPerMonth)
let indexPath = IndexPath(row: desireRow, section: desireSection)
curriculumViewDatas[desireSection].weekDatas[desireRow+4].isExpanded = true
self.curriculumTableView.reloadData()
self.curriculumTableView.scrollToRow(at: indexPath, at: .top, animated: false)
} else {
let weekPerMonth = 4
let desireSection = (userWeek / weekPerMonth) - 1
let desireRow = (userWeek % weekPerMonth)
let indexPath = IndexPath(row: desireRow, section: desireSection)
curriculumViewDatas[desireSection].weekDatas[desireRow].isExpanded = true
self.curriculumTableView.reloadData()
self.curriculumTableView.scrollToRow(at: indexPath, at: .top, animated: false)
}
}
๊ณ์ฐ๋ ์ ์ ์ ์ฃผ์ฐจ๋ก ์ด๋ row๋ก ๊ฐ์ผ๋ ์ง ์๋ ค์ค๋๋ค. ์ฐ์ ๋งค๋ฌ 4๊ฐ์ ์ฃผ๊ฐ ์์ด์ weekPerMonth๋ฅผ 4๋ก ๊ณ ์ ํ๊ณ , desireSection์ ๋ฐ์์จ ์ ์ ์ ์ฃผ์ฐจ / 4๋ฅผ ํ ํ -1์ ํด์ฃผ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Row๋ ๋๋ ๊ฐ์ ๋๋จธ์ง๋ก ๊ฐ๋๋ก ๊ตฌํํ์ต๋๋ค. ๊ทผ๋ฐ 10๊ฐ์ section์๋ 5๊ฐ์ row๊ฐ ์์ต๋๋ค. ์ฆ ์ฃผ์ฐจ๊ฐ 5๊ฐ ์์ต๋๋ค. ๊ทธ๋์ 40์ผ๋๋ง ๋ฐ๋ก ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์์ต๋๋ค. ํ์ง๋ง ์ด ๋ฉ์๋ค viewDidLoad์์ ์คํ์์ผฐ์ ๋, ์ ๋๋ก scrollToRow๊ฐ ์คํ๋์ง ์์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ API๋ก ๋ฐ์์ค๋ scrollToRow๋ฅผ ํธ์ถํ ๋๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ์์์ง๊ธฐ ์ (๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ)์ด๊ธฐ ๋๋ฌธ์ viewDidLoad์์ ์คํ์ด ์ ๋๋ก ๋์ง ์์๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋์ viewDidLayoutSubviews์์ scrollToRow ๋ฉ์๋๋ฅผ ์คํํ์ต๋๋ค.