๊ณผ์ ๋ก ๋ง๋ค์๋ UPlayList๋ฅผ swift๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ฉฐ UI์ ๋ํ ์์ฌ์ด ์๊ฒผ๋ค.
UIPageControl์๋ ์ด๋ฏธ SnapScroll๊ณผ ๊ด๋ จํ ์ ๋ณด๋ค์ด ๋ง์๋ฐ, TableViewControll์ ์์นญํด๋ ์ฐพ์๋ณด๊ธฐ ํ๋ค์ด์,,
๋์๊ฒ๋ ์ด๊ฑธ ์ฐพ๋์ฌ๋์๊ฒ๋ ๋์์ด ๋ ๊ฒ ๊ฐ์ ๊ธฐ๋ก์ ๋จ๊ธฐ๋ ค๊ณ ํ๋ค.
0. SnapScroll

๋ํ์ ์ผ๋ก ์ ํ๋ธ ์์ธ ๋ ํฑํก์์ ์์ฃผ ์ ํ ์ ์๋๋ฐ, ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์คํฌ๋กค์ ๋ด๋ฆฌ๊ฑฐ๋ ํ์ด์ง๋ฅผ ์ด๋ํ๋ฉด
์์์ฒ๋ผ ๋ชจ์๋ฆฌ์ ๋ฌ๋ผ๋ถ๋ ์ ๋๋ฉ์ด์
์ด๋ค.
CSS๊ณต์๊ฐ์ด๋์์ ์ด๊ฒ ๋ฌด์์ธ์ง ์ฝ๊ฒ ์ ์ ์๋ค.
1. UITableView

์คํฌ๋กค์ด๋ผ๋ ๊ต์งํฉ์ด ์๊ธฐ ๋๋ฌธ์ (์คํฌ๋กค๋ทฐ๊ฐ ํต์ฌ ๊ธฐ๋ฅ์ด๋ฏ๋ก) ์๋ง ์ด๋ ์์ ์์๋ฐ๋๊ฒ ์๋๊น ์ถ๋ค.
์ด์จ๋ , UIScrollView๋ฅผ ์์๋ฐ๊ธฐ ๋๋ฌธ์ ํ ์ด๋ธ๋ทฐ๋ ์คํฌ๋กค๋ทฐ์ delegate protocol์ ํ์ฉํ ์ ์๊ณ ์ด๊ฒ์ด ์ค๋ ๊ตฌํํ ๋ด์ฉ์ ํต์ฌ ์ฌ๋ฃ์ด๋ค.
์ฆ ํ์ํ๊ฑด ์คํฌ๋กค๋ทฐ์ ํ ์ด๋ธ๋ทฐ์ ๋์ ๋ฐ ๊ด๋ จ ๋ฉค๋ฒ์ ๋ฉ์๋์๋ํ ์ดํด, ์ ์ ํ delegate func์ฑํ ์ ๋๋ผ๊ณ ํ ์์๋ค.
2. ์คํฌ๋กค๋ทฐ์ ๋์ ์ดํด
๊ทธ๋ฅ ์ฌ๊ธฐ์์ ๋ณด์ ์์ฃผ ์ ์ค๋ช
ํด ๋์ผ์
จ๋ค
๊ด๋ จ๋ ๋ด์ฉ์ด ๋ฐฉ๋ํด ์์ ํ ์์ง๋ ํ์ง ๋ชปํ๊ณ (์ด๊ฑธ ๋ค ์ค๋ช
ํ๊ธฐ ์์ํ๋ฉด frame,bounds๋ฑ ๋๋ฌด ๋ณต์กํ๋ค)
ํ์ํ๊ฒ๋ง ์์ ๋นผ๋ด ๋ณด์.
์ผ๋จ ์๋ก ์คํฌ๋กคํ๋์ง, ์๋๋ก ์คํฌ๋กคํ๋์ง ์์์ผ ์๋ก ๋ถ์ด๋ ์๋๋ก ๋ถ์ด๋ ํ๊ธฐ๋๋ฌธ์, ์ด๊ฑธ ๋จผ์ ์ฒ๋ฆฌํด์ผ ํ๋ค.

์์ฃผ ์ฝ๊ณ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ด ์๋ค. ์คํฌ๋กค ์ contentOffset๊ณผ ์คํฌ๋กค ํ์ contentOffset๋ฅผ ๋น๊ตํด์, y์ ๋ณํ์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ๊ธฐ ํด์ฃผ๋ฉด ๋๋ค.
lastContentOffset์ด ํด๋์ค ๋ฉค๋ฒ์ด๊ณ , UITableView๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์ ๋ด์์ ์๋ํ๋ค๊ณ ๊ฐ์ ํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
private var lastContentOffset: CGFloat = 0
...
private func snapScrolling(_ tableView: UITableView) {
if (self.lastContentOffset > tableView.contentOffset.y) {
print("up")
return
}
}else if (self.lastContentOffset < tableView.contentOffset.y) {
print("down")
return
}
self.lastContentOffset = tableView.contentOffset.y
return
}
3. ๋์ ์๊ณ ๋ฆฌ์ฆ ์์ฑ
์ ์๋๋ก ์์ง์ด๋๊ฒ์ ์๋๊ฒ๋ง์ผ๋ก๋ ๋ถ์กฑํ๋ค. ๋ด ์ฑ์ ์์ฐฌ๋ค.
์๋ํ๋ฉด ์ค์๋ก๋ผ๋ ์ ์๋๋ก ์์ฃผ ์กฐ๊ธ ์์ง์๋๋ฐ๋, ๊ทธ๋ฅ ๋ค๋ฅธ ์
๋ก ๋์ด๊ฐ ๋ฒ๋ฆด๊ฑฐ๊ธฐ ๋๋ฌธ
์ฆ ์ฌ์ฉ์์ ํ์๋ฅผ ์์ธกํด์ "๋ญ ์ด์ ๋๋ฉด ๋๊ฒจ์ง๊ฒ ์ง" ํ๊ณ ๋๊ธฐ๋ ์ ๋(์๊ณ์น)๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ํ๋๊ฒ์ด ์ด ๊ธ์ ํต์ฌ์ด๋ค.
์ผ๋จ contensOffset์ ์์์ผ๋ ์ง๊ธ ๋ด ์
์ด ์ด๋์ฏค์ ์๋๊ฑด์ง๋ ์ ์ ์๋ค. ์ด ์
์ A๋ผ๊ณ ํ๋ฉด
๋ด๊ฐ A์
์ ์/์๋๋ก๋ ์ด๋์ ๋ ์ด๋์ํค๋ฉด ๋ค์ ์
๋ก ๋๊ธฐ๋ฉด ๋๋ค.
์ด ์ด๋์ ๋๋ ์ด๋ป๊ฒ ์ ์ ์์๊น? ์ ํด์ ธ ์์ง ์์ผ๋ ๋ด๊ฐ ์ง์ ์ ํด์ผ ํ๋ค.
์ฌ๋ฌ ์๋๋ฅผ ํด๋ดค๋๋ฐ, ๋๋ต ํ๋ฉด์ 0.5/3.0 ์ ๋๊ฐ ๋๊ฒจ์ง๋๊ฐ ์ ํฉํ๋ค๊ณ ํ๋จํ๋ค.
(์
์ด ํ
์ด๋ธ๋ทฐ๋ฅผ ๊ฐ๋ ์ฑ์ด ์ํ ์ฆ window๋ฅผ ๊ฐ๋ ์ฑ์ด ์ํ ์ผ๋ ์๊ธฐ๋ฅผ ํ๊ณ ์์)
์ฆ ์คํฌ๋กค์ด ๋๋ ์์น๊ฐ contentOffSet.y + ์
.height * 0.5/3.0 ์ ๋๋ฌํ์ ๋ ๋ค์ ์
๋ก ๋๊ธด๋ค.
ํ์ง๋ง ๋ฌธ์ ๊ฐ ์๋ค.
์ด๋ ๊ฒ ํ๋ ค๋ฉด ํ์ฌ ๋ณด๊ณ ์๋ ์
์ ์ธ๋ฑ์ค๊ฐ ์ฒ์๋ถํฐ ํ์ํ๋ค. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ํ๊ฐ ์ด๋ ต๋ค,,, ๊ทธ๊ฑด ๋ด ์คํ์ผ์ด ์๋
๊ทธ๋์ ์๊ฐ์ ์กฐ๊ธ ๋ฐ๊พธ๊ธฐ๋ก ํ๋ค.
ํ
์ด๋ธ๋ทฐ๋ indexPathForRow๋ผ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ด๋
์์ ํน์ ์ขํ๋ฅผ ์ฐ์ด ๊ทธ ์
์ ์ธ๋ฑ์ค์ ๋ณด๋ฅผ ๋ฐํํด์ค๋ค.
๊ด์ ์ ์กฐ๊ธ ๋ฐ๊ฟ ์๊ฐํด๋ณด๋ฉด, ํ์ฌ ์
์ ์คํฌ๋กค์ด ์ง๋ ์ ๋๋ ๊ณง ๋ค์ ์
์ ๋ชจ์ต์ด ๋๋ฌ๋๋ ์ ๋์ ๊ฐ๋ค.
์ฆ, ์คํฌ๋กค์ด ๋๋ contentOffset.y + ์
.height*2.5/3.0์ ์์นํ๋ ์
์ด ๋ค์ ์
์ด๋ผ๋ฉด ๋ค์ ์
๋ก ๋๊ธฐ๋ฉด ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ด์ ์
์ contentOffset.y - ์
.height*0.5/3.0
private func snapScrolling(_ tableView: UITableView) {
var visibleRect = CGRect()
visibleRect.origin = tableView.contentOffset
let visiblePointToNxt = CGPoint(x: visibleRect.origin.x, y: visibleRect.origin.y + tableView.frame.height*(์์๊ฐ))
let visiblePointToPrv = CGPoint(x: visibleRect.origin.x, y: visibleRect.origin.y - tableView.frame.height*(์์๊ฐ))
if (self.lastContentOffset > tableView.contentOffset.y) {
print("up")
if let indexPath = tableView.indexPathForRow(at: visiblePointToPrev){
tableView.scrollToRow(at: indexPath, at: .top, animated: true)
self.lastContentOffset = tableView.contentOffset.y
}
}else if (self.lastContentOffset < tableView.contentOffset.y) {
print("down")
if let indexPath = tableView.indexPathForRow(at: visiblePointToNxt)
{ tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}
}
self.lastContentOffset = tableView.contentOffset.y
return
}
4. Delegate func ์ฑํ
์ด์ ๋ง๋ ํจ์๋ฅผ ํธ์ถํด์ค ์ ๋นํ ๋
์์ ์ฐพ์ผ๋ฉด ๋๋ค.
๋คํํ๋(์ด๋ฏธ ์ธ ์๊ฐ์ด์์ง๋ง) scrollViewWillEndDragging๊ฐ ์ฐ๋ฆฌ๋ฅผ ๊ตฌ์ํด์ค ๊ฒ์ด๋ค.
(๋์์ ์์ ์ ์ํด ๋น๋๊ธฐ๋ก 0.05์ด ์ ๋์ ๋๋ ์ด๋ฅผ ์ฃผ์๋ค.)
func scrollViewWillEndDragging(_ scrollView: UIScrollView,
withVelocity velocity: CGPoint,
targetContentOffset: UnsafeMutablePointer<CGPoint>)
{
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
self.snapScrolling(scrollView as! UITableView)
}
}
์์ฑ!

'learnings > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS/Swift] ์๋ฉธ์๋ฅผ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ํด์ (0) | 2024.03.26 |
---|---|
[iOS/Swift] ์ธ์คํด์ค์ ์ํ ์ฐธ์กฐ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๋์ (0) | 2024.03.21 |
[iOS/Swift] #1-2 ๋์ ์ฒซ ํ ์ดํ๋ก์ ํธ (0) | 2021.09.23 |
[iOS/Swift] #1-1 ๋์ ์ฒซ ํ ์ดํ๋ก์ ํธ (0) | 2021.09.21 |
[iOS/Swift] ๋ฉ๋ชจ (0) | 2021.07.01 |