๐ฑ ๋ด๊ฐ ๋ด๋นํ ๋ทฐ
๋๋ ์๋์ ๊ฐ์ ๋ทฐ๋ฅผ ๋ด๋นํ๊ณ , ํด๋น ๋ทฐ๋ ์คํฌ๋กค์ด ๋ ํนํ ๋ฐฉ์์ผ๋ก ์ ์ฉ๋๋ค. ์ด๋ค ๋ฐฉ์์ด๋๋ฉด, ๊ทธ ์๋ ํ๋ฉด์ฒ๋ผ, ์ผ์ ์คํฌ๋กค์ด ๋๋ฉด ์ฝ! ์๋์ผ๋ก ๋์ด๊ฐ์ผํ๋ค.
์ด๋ ๊ฒ ๋์ด๊ฐ์ผํ๋ค.
๋ด๊ฐ ๊ตฌํํด์ผํ ํ๋ฉด์, ์ด ๋ ํ๋ฉด์ด๊ณ , ์๋๋ก ๋ด๋ฆฌ๋ฉด, ์ค๋ฅธ์ชฝํ๋ฉด์ด, ์๋ก ์ฌ๋ฆฌ๋ฉด ์ผ์ชฝํ๋ฉด์ด ๋์์ผํ๋ค. ํด๋น ๋ทฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ๋ค์ํ ๋ฐฉ์์ ๋ํด์ ๊ณ ๋ฏผํ๋ค.
์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น?
๋ค์ํ ๋ฐฉ์์ ์๊ฐํ๋ค. (์ฌ์ค ์ ๋ง ๊ฐ๋จํ ๋ฐฉ์์ด ์์์ง๋ง, ํด๋น ๋ฐฉ์์ ์ ํด๋ณด์ง ๋ชปํ๋ ๋๋ ์ฌ๋ฌ๊ฐ์ง ๊ฐ๋ ๊ธธ์์ ํค๋งธ๋ ๊ฒ ๊ฐ๋ค.)
1๏ธโฃ ์ฒซ๋ฒ์งธ ์๊ฐ - PageControl ์ด๋ผ๋ ๋ ์์ ์ฌ์ฉํด๋ณด์
์ผ์ชฝ์ ์ด๋ฏธ์ง๊ฐ ๋ด๊ฐ ์ฒ์์ ์๊ฐํ๋ ๊ตฌ์ฑ์ด๋ค. ๋๊ฐ์ UIView๋ฅผ PageControl ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ์ฝ์ฝ ๋๊ฒจ์ฃผ๋ ๊ฒ์ด๋ค.
๊ทผ๋ฐ, ํ์์๊ฒ ๋ฌผ์ด๋ณด๋๊น, “ํด๋น ํ์์ PageControl ๊ธฐ์ ์ UICollectionView๋ด๋ถ์์๋ง ์๋๋๋ ๊ธฐ๋ฅ์ด ์๋๊ฐ?” ์ถ์ด์ ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด, ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ, ์ปค๋ค๋ UICollectionView๊ฐ ํ๋ฒ ๋ ์๊ธฐ๊ณ , ๊ทธ ์์ UIView์ UICollectionview ๋ฑ๋ฑ ๋ทฐ๊ฐ ๊ต์ฅํ ๋ฌด๊ฑฐ์์ก๋ค.
์ด๋ ๊ฒ ํ๊ฒ๋๋ฉด ์น๋ช ์ ์ธ ๋จ์ ์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฐฉ์์ ์ฌ์ฉํ์ง ๋ชปํ ๊ฒ ๊ฐ์๋ค.
ํด๋น ๋๊ฐ์ง ์ด์ ๋๋ฌธ์ด์๋ค.
Network ์์ ์ ์์ํ๋ฉด์ API์ฐ๋์ ์์ํ๋ฉด ๋ฐ์ดํฐ์ ์ ๋ฌ์ ๋ฌธ์ ๊ฐ ์๊ธธ๊ฒ์ด๋ผ๋ ๋ง์ ๋๋ฌด ๊ณต๊ฐํ๋ค. ๋ง์.. ์ฝ์ง ์๊ฒ ๋ค… ๋์ฒด ๋ช๋ฒ reload๋ฅผ ํด์ค์ผํ๋๊ฑฐ์ผ…. ์๋ผ์๋ผ…
2๏ธโฃ ๊ทธ๋์ ์๊ฐํ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ, ์ผ์ ์์ค scrollView๊ฐ ์์ง์ด๋ฉด, ์๋ก ํ! ์ฌ๋ ค๋ฒ๋ฆฌ๊ธฐ
ํด๋น ๋ฐฉ์์ฒ๋ผ ๊ตฌํํ๊ธฐ ์ํด์๋, ์ฌ์ฉ์๊ฐ scrollView๋ฅผ ์ผ๋งํผ ์์ง์๋์ง ์ขํ๊ฐ์ ์ฐ๋ค๊ฐ, ์ผ์ ์์ค์ ์ขํ๊ฐ์ ๋์ด๊ฐ๋ฉด contentview2 (ํน์ scrollview์ ๋งจ์๋)์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ด๋ค.
ํด๋น ๋ฐฉ์์ ๊ณ ๋ คํด๋๊ณ ๋,, ๋ค๋ฅธ๋ฐฉ์์ด ์๊ฐ๋ฌ๋ค.
3๏ธโฃ ์ ์ค์ณ ์ธ์์ ํตํด์ ๋ทฐ ์ ํํด์ฃผ๊ธฐ
๊ทธ๋ฅ ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ์๋ก ์ฌ๋ฆฌ๋ ์ ์ค์ณ๋ฅผ ์ฌ์ฉํด์ ๋ทฐ์ ํ์ ํด์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ ๋๋ฉ์ด์ ์ผ๋ก ์ค๋ฅด๋ฅด๋ฅต ํ๋ฉด์ ์คํฌ๋กค ์๋ ์๋ ๋๋ฒ์งธ ๋ทฐ๊ฐ ์ฌ๋ผ์ค๊ฒ ๊ตฌํํ๋ ๋ฐฉ์์ด๋ค… ํ .. ์์ํ์๋ ์์ฃผ ์ด์ํ ๊ฒ ๊ฐ์๋ค.
2๏ธโฃ์ 3๏ธโฃ์ ๋ฐฉ์์ ๋น๊ตํ์๋, ๋ ๋์ ๋ฐฉ์์ 2๏ธโฃ๋ฒ ๋ฐฉ์ ๊ฐ์๋ค. ์ด์ ๋ ์๋์ ๊ฐ๋ค.
- ScrollView๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์คํฌ๋กค์ด ์์ฐ์ค๋ฝ๊ณ , PageControl์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ฅ ๋น์ทํ๊ฒ ๊ตฌํํ ์ ์๋ค.
- ์ ์ค์ณ๋ก ํ๋ฉด์ ์ด๋์ํค๋ ๊ฒ์, ์ผ๋ฐ์ ์ผ๋ก ์คํฌ๋กคํ ๋ ํ๋ ์ก์ ์ด ์๋๋ฏ๋ก, UX๊ฐ ๊ตฌ๋ ค์ง ์ํ์ด ์๋ค.
๊ทธ๋์ ์ด๋ ๊ฒ 2๏ธโฃ๋ฒ์ผ๋ก ์ฑํํ๋ค. (ํ์,,,๋ค…)
โ ๊ทธ๋์ ์ด๋ค ๋ฐฉ์์ ์ฑํํ๋์?
์์์ ๋งํ ์ด์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก 2๏ธโฃ๋ฒ์ผ๋ก ๊ตฌํํ๋ ค๊ณ ํ์์ผ๋, PageControl์ ๋ํด์ ๊ถ๊ธํด์ง ๋๋ ๋ ๊ตฌ๊ธ๋ง์ ํด๋ณด๊ธฐ๋ก ํ๋ค.
๊ทธ๋ฌ๋ ์์ค, PageControl์ UICollectionView ๋ด๋ถ์์ paging ๊ธฐ์ ์ด ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ, UIPageControl์ UIScrollView์์๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค๊ณ ํ๋ ๊ฒ์ด๋ค!
๊ทธ๋๊น, ์์ธํ ์์๋ณด๋ฉด, ,, ์๋์ ๊ฐ์ ์ธ์คํ๊ทธ๋จ ์ฌ์ง ๋๊ธฐ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค ์น์.
CollectionView ๋ด๋ถ์์ paging ๊ตฌํํด์ฃผ๊ธฐ
ํด๋น ์ด๋ฏธ์ง๋ค์ ๋ชจ๋ CollectionView ๋ด๋ถ์ ๋ฃ์ด์ฃผ๊ณ ๊ทธ ์์์ paging ๊ธฐ๋ฅ์ ๊ตฌํํด์ฃผ๋ ๋ฐฉ์์ด๋ค. ์๋,, ์ด๋ฏธ์ง๋ฅผ ๋๊ธธ๋ ์ด ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
์ด๋ฏธ์ง๋ฅผ ๋๊ธฐ๋ ๋ฐฉ์์๋ ๋๊ฐ์ง๊ฐ ์๋๋ฐ, ๊ทธ ๋๊ฐ์ง ๋ฐฉ์์ ์๋์ ๊ฐ๋ค.
๐ก ์ฝ๋ ์ฐธ๊ณ - https://eunjin3786.tistory.com/203
scrollViewWillEndDragging ๋ฉ์๋ ์ด์ฉํด์ ๊ตฌํํ๊ธฐ
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
guard let layout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return }
let cellWidthIncludingSpacing = layout.itemSize.width + layout.minimumLineSpacing
let estimatedIndex = scrollView.contentOffset.x / cellWidthIncludingSpacing
let index: Int
if velocity.x > 0 {
index = Int(ceil(estimatedIndex))
} else if velocity.x < 0 {
index = Int(floor(estimatedIndex))
} else {
index = Int(round(estimatedIndex))
}
targetContentOffset.pointee = CGPoint(x: CGFloat(index) * cellWidthIncludingSpacing, y: 0)
}
Custom Layout ๊ตฌํํ๊ธฐ
class CustomCollectionViewFlowLayou: UICollectionViewFlowLayout {
private var previousOffset: CGFloat = 0
private var currentPage: Int = 0
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
guard let collectionView = collectionView else {
return super.targetContentOffset(forProposedContentOffset: proposedContentOffset, withScrollingVelocity: velocity)
}
let itemsCount = collectionView.numberOfItems(inSection: 0)
// Imitating paging behaviour
// Check previous offset and scroll direction
if previousOffset > collectionView.contentOffset.x && velocity.x < 0 {
currentPage = max(currentPage - 1, 0)
} else if previousOffset < collectionView.contentOffset.x && velocity.x > 0 {
currentPage = min(currentPage + 1, itemsCount - 1)
}
// Update offset by using item size + spacing
let updatedOffset = (itemSize.width + minimumInteritemSpacing) * CGFloat(currentPage)
previousOffset = updatedOffset
return CGPoint(x: updatedOffset, y: proposedContentOffset.y)
}
}
์ด๋ ๊ฒ ๊ตฌํํ๋ค๊ณ ํ๋ค. ์๊ฐ๋ณด๋ค ์ข ๋ณต์ก.. ํ๋ค. ์๋๋ฉด Swift ์ด๋ณด์ธ ๋์๊ฒ CollectionView๋ ์กฐ๊ธ ๋ณต์กํ๋๊น!!
์ฐพ์๋ณด๋ค ๋ณด๋, ์ด๋ฐ ์ฌ์ง ๋๊ธฐ๋ ๋ฐฉ์์๋ UIScrollView๋ฅผ ์ฌ์ฉํ ๋ฐฉ์๋ ์์๋ค.
โ UIScrollView์์ UIPageControl์ ์ฌ์ฉํ์!
๐ก ์ฐธ๊ณ - https://fomaios.tistory.com/entry/Swift-์คํฌ๋กค๋ทฐ๋ก-์ด๋ฏธ์ง-ํ์ด์ง์ฒ๋ผ-๋๊ธฐ๊ธฐImage-Paging-with-UIScrollView
ํด๋น ๋ธ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด, UIScrollVIew๋ฅผ ์ฌ์ฉํด์ PageControl ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ์์ด ๋์จ๋ค. ์ด ๋ฐฉ์์, ๋ด๊ฐ ์ฒซ๋ฒ์งธ๋ก ์๊ฐํ๋ ๋ฐฉ์๊ณผ ๋น์ท ์๋!! ๋๊ฐ๋ค!!
์ด๋ฐฉ์!!
โ ๊ทธ๋์ ๋๋, ํด๋น ๋ฐฉ์์ ์ฐ์ ์ ์ผ๋ก ์ฑํํด๋ณด๊ธฐ๋ก ํ๋ค. ์คํฌ๋กค์ ์ธ์ํด์ ๋ทฐ๋ฅผ ๋๊ธฐ๋ ๋ฐฉ์๋ ์กฐ๊ธ ๋ถ์์ฐ์ค๋ฝ๋ค๊ณ ์๊ฐํ์๋๋ฐ, ๋ด์ฅ๋์ด์๋ UIPageControl ์ ์ฌ์ฉํด์ ๊ตฌํํ ์ ์๋ค๋ฉด ๋ ์์ฐ์ค๋ฌ์ด ํ๋ฉด ์ด๋์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ์๋ค!
๊ตฌํ
- ์ฐ์ ๋ทฐ์์ ํ์ํ ํ๋กํผํฐ๋ค์ ๋ชจ๋ ๋ง๋ค์ด์ฃผ์๋ค.
private let pageControl: UIPageControl = {
let pagecontrol = UIPageControl()
pagecontrol.isHidden = true
return pagecontrol
}()
private lazy var scrollview: UIScrollView = {
let scrollview = UIScrollView()
scrollview.contentSize = CGSize(width: UIScreen.main.bounds.width,
height: UIScreen.main.bounds.height * CGFloat(self.imagenames.count))
scrollview.showsHorizontalScrollIndicator = false
scrollview.showsVerticalScrollIndicator = false
scrollview.isScrollEnabled = true
scrollview.isPagingEnabled = true
scrollview.bounces = false
return scrollview
}()
private let uiview1: UIView = {
let view = UIView()
view.backgroundColor = .red
return view
}()
private let uiview2: UIView = {
let view = UIView()
view.backgroundColor = .blue
return view
}()
private lazy var contentviews: [UIView] = [self.uiview1, self.uiview2]
- ๋๋ ๋ ํ์ด์ง๋ง ๋ง๋ค์ด ์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์, pagecontrol์ด ๋ณด์ผ ํ์๊ฐ ์๋ค. ๊ทธ๋์ isHidden์ true๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
- pageControl ์ด๋ progress bar? ๊ฐ์ ๊ฒ์ด๋ค. (์๋ ์ ์ ์ ์ฌ์ง)
- scrollView์์๋ contentSize๋ฅผ ๋ทฐ ๋๊ฐ ํฉ์น ๊ฐ์ผ๋ก ๋ง๋ค์ด์ฃผ์๋ค. (์์๋ ์คํฌ๋กค ํ ์ ์๋๋ก height๋ฅผ ๋๋ฐฐ๋ก ๋๋ ค์ฃผ์๋ค.)
- scrollview์์ scroll indicator๋ ๋ชจ๋ ์จ๊ฒจ์ฃผ์๋ค.
- isScrollEnabled ์ isPagingEnabled ๋ฅผ ๋ชจ๋ true๋ก ํด์ฃผ์ด์ผ paging ์คํฌ๋กค์ด ๊ฐ๋ฅํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋๋ ์คํฌ๋กค์ด ๋ ๋ง์ง๋ง ํ๋ฉด์์ bounce๊ฐ ํ์์๊ธฐ์ bounces๋ฅผ false๋ก ์ฃผ์๋ค.
- ๋ง์ง๋ง์ผ๋ก ๋ด๊ฐ pageControlํ uiview๋ ๊ฐ๋ฅผ contnetviews ๋ฐฐ์ด์๋ค๊ฐ ๋ฃ์ด์ฃผ์๋ค. lazy var๋ก ์ ์ธํ ์ด์ ๋, uiview๊ฐ ๋ชจ๋ ์์ฑ๋๊ณ ๋์ ํด๋น ๋ฐฐ์ด์ด ์์ฑ๋์ด์ผํ๊ธฐ ๋๋ฌธ์ lazy๋ฅผ ์ฌ์ฉํด์ฃผ์๋ค.
1. ๋ด๊ฐ ์ํ๋ uiview ์ ๋งํผ addsubviewํด์ฃผ๊ธฐ
private func addContentScrollView() {
for i in 0..<2 {
let view = contentviews[i]
view.frame = UIScreen.main.bounds
view.frame.origin.y = UIScreen.main.bounds.height * CGFloat(i)
scrollview.addSubview(view)
}
}
๋ด๊ฐ ์ํ๋ ๋ทฐ๋ค ์ ๋งํผ addsubview๋ฅผ ํด์ค๋ค. ๋๋ ๋๊ฐ๋ง ํ์ํ๊ธฐ ๋๋ฌธ์ 2๋ฅผ ๋ฃ์ด์ฃผ์๋ค. addsubviewํด์ฃผ๋ ๋ทฐ๋ค์ ํฌ๊ธฐ๋ ํ๋ฉด ์ ์ฒด๋ฅผ ๊ฐ์์ ์๋ ํฌ๊ธฐ๋ก ๋ฃ์ด์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ๋ทฐ๊ฐ ์ด์ ๋์ด๊ฐ y์ขํ์ ์์์ ์ ์ง์ ํด์ฃผ์ด์ผํ๋๋ฐ, ๊ทธ ์์์ ์ height์ index๋ฅผ ๊ณฑํด์ ๊ตฌํ ์ ์๋ค.
2. ํ์ด์ง ์ปจํธ๋กค ๊ฐฏ์ ๊ตฌํด์ฃผ๊ธฐ
private func setPageControl() {
pageControl.numberOfPages = 2
}
์ด๋ ๊ฒ ๊ตฌํํ๋ฉด, ์๋์ ๊ฐ์ด ๋ด๊ฐ ์ํ๋ ํ๋ฉด์ ๊ตฌํํ ์ ์๋ค.
๐ ๋ง๋ฌด๋ฆฌ
ํ๋์ ๋ทฐ๋ฅผ ๋ง๋ค๊ธฐ ์ ์ ๊ฐ์ฅ ๋ง์ ๊ณ ๋ฏผ์ ํ๋ ๊ฒฝํ์ด์๋ค. ์ด ๋ค๊ฐ์ง์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ด๋ฉด์, ์ด๋ป๊ฒ ๊ตฌํํด๋๊ฐ์ง ๊ณ ๋ฏผํ๋ ์๊ฐ์ ๊ฐ์ง๋๊น, UIKit์ ๋ํ ์ดํด๋ ๋ ๊น๊ฒ ๋๋ ๋๋์ด์๋ค. ”CollectionView ๋ด๋ถ์ Paging๊ธฐ์ ์ ์ฌ์ฉํด๋ณผ๊น?”, “๊ทธ๋ฅ UIView์ Paging ๊ฐ๋ ์ ๋ฃ์ ์๋ ์์๊น?” ๋ฑ ๋ค์ํ ์๊ฐ์ ํ๊ณ , ํด๋น ๋ทฐ๋ฅผ ์ง์ ๊ทธ๋ ค๋ณด๋ฉด์ ๋ทฐ๋ฅผ ๋ฐ๋ผ๋ณด๋ ์๊ฐ์ ๊ธธ๋ ๋๊ฒ๊ฐ๋ค.
๋น๋ก ๋ด๊ฐ ์๊ฐํ ๋ฐฉ์์ค์ ๊ฐ์ฅ ์ฒ์์ ์๊ฐํ ๋ฐฉ์์ผ๋ก ์ฑํ๋์๊ณ , ๊ตฌํ์ ์๊ฐ๋ณด๋ค ์์ฒญ ๊ฐ๋จํ์ง๋ง, ์ด๋ ๊ฒ ๋ง์ ์๊ฐ์ ํด๋ดค๋ ๊ฒ์ ๋ํด์๋ ํํ๋์ง ์์๋ค. ์กฐ๊ธ ๋ ๋ด๊ฐ ์ ์ด๋ ๊ฒ ๊ฐ๋ฐํ๋์ง์ ๋ํด์ ๊ณ ๋ฏผํ๋ ์๊ฐ์ด ๋์๋ฌ๊น?
๊ทธ๋ฆฌ๊ณ ํ์์ด UICollectionView ๋ด๋ถ์ Paging ๊ธฐ์ ์ ์ฌ์ฉํด์ผํ๋ค๊ณ ์๋ ค์ฃผ์์๋๋ฐ, ๊ทธ๋ ์ง ์์๊ณ ๋ด๊ฐ ์ฒ์ !! ๋ง์ฐํ๊ฒ ์๊ฐํ๋ ๋ฐฉ์์ด ๋ง์์๋ค. ์ด ๋ฐฉ์๋ ๊ฐ๋ฅํ๋ค๊ณ ํ์์๊ฒ ์ผ๋ฅธ ์๋ ค์ฃผ๊ณ ์ถ๋ค! ๊ทธ ํ์์๊ฒ ๋ง์ ๋์์ ๋ฐ์์๋๋ฐ, ์ด๋ฒ ๊ธฐํ๋ก ๋๋ ์์ง๋ง, ํ๊ฐ์ง๋ผ๋ ๋ ์๋ ค์ค ์ ์๋ ์๊ฐ์ด ๋ ์ ์์ ๊ฒ ๊ฐ์์ ๊ธฐ๋ปค๋ค. ๋ ์ฑ์ฅํ์!
์ฐธ๊ณ ์๋ฃ
https://ios-development.tistory.com/397
https://eunjin3786.tistory.com/203