์ด์ ํฌ์คํ ์์ Carousel effect (UICollectionViewController paging)์ ๊ตฌํํ์์ง๋ง ๊ฐ์ ์ฌํญ์ด ์์์ด์! ๋ฐ๋ก ์ฟฐ์ฒ๊ฑฐ๋ฆฌ๋ ์ด์! ํฌ์คํ ์ ๋ชฉ์ ๋ญ๋ผ ์ง์ ์ง๋ ์ ๋งคํ...ใ ใ ใ
์์ ์ํ๊ณ ๊ทธ๋๋ก ์ฐ๊ธฐ์๋ ๋ง์์ ๊ฑธ๋ฆฝ๋๋ค! ๋ฌด์กฐ๊ฑด ์ฌ์ฉ์๊ฐ UI/UX์ ๋ถ๋๋ฌ์์ ๋๋ผ๊ฒ ํด์ฃผ๊ณ ์ถ๋จ ๋ง์ด์ฅฌ ๐ค
์ฌํํผ ์์ ํด ๋ด ์๋ค ์์ฑ๋ ์ฝ๋๋ ์ฌ๊ธฐ ๊นํ๋ธ์์ ๋ค์ด ๋ฐ์ผ์๋ฉด ๋ฉ๋๋ค-> ๊นํ๋ธ๋งํฌ
์ฐ์ ์ด์ ํฌ์คํ ์์ ์์ฑํด ๋์๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ก๊ทธ๋ฅผ ์ํด print ๋ฌธ์ ์ถ๊ฐํด ์ฃผ์์ต๋๋ค
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
guard let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else {
return
}
let contentLeftInset = scrollView.contentInset.left
let cellWithSpacing = layout.itemSize.width + layout.minimumLineSpacing
print("ํ๊ฒ ์คํ์
::: ", targetContentOffset.pointee.x)
print("์คํฌ๋กค๋ทฐ ::: ", scrollView.contentOffset.x)
let index = (targetContentOffset.pointee.x + contentLeftInset) / cellWithSpacing
let roundedIndex: CGFloat = round(index)
targetContentOffset.pointee = CGPoint(x: roundedIndex * cellWithSpacing - contentLeftInset, y: scrollView.contentInset.top)
print("์ต์ข
::: ", targetContentOffset.pointee.x)
print("\n")
}
์ ๊ทผํ ์ ์๋ ์ ๋ณด๋
์๋ ์ด๋ํ๋ ค๊ณ ํ๋ ์คํ์ ๊ฐ targetContentOffset, ์คํฌ๋กค ๋ทฐ์ ์์ฑ, velocity ์ด๋ ๊ฒ ์๋๋ฐ ํ๋ฒ ํด๊ฒฐํด ๋ด ์๋ค
contentOffset ๋ผ๋ฆฌ ๋น๊ตํด ๋ณด๋ฉด ๋ญ๊ฐ ๋์ฌ ๊ฒ ๊ฐ์๋ฐ ๋ง์ด์ฃ
์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ (์ปจํ ์ธ ๋ ๋ก๋ฉ ํ๋ ๋ฐฉํฅ)
์ฟฐ์ฒ : ์๋ ๊ฐ๋ ค๋ ํ๊ฒ ์คํ์ > ์คํฌ๋กค ๋ทฐ ์์น
์ ์ : ํ๊ฒ์คํ์ 225 > ์คํฌ๋กค ๋ทฐ 78
์ด์ ์ปจํ ์ธ ๋ฅผ ๋ณด๋ ค๊ณ ํ ๋
์ฟฐ์ฒ : ๊ฐ๋ ค๋ ํ๊ฒ ์คํ์ < ์คํฌ๋กค ๋ทฐ ์์น
์ ์ : ํ๊ฒ ์คํ์ < ์คํฌ๋กค ๋ทฐ
=> ์ฌ๊ธฐ์ ์ ์ ์๋ ๊ฒ
์ปจํ ์ธ ๋ฅผ ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ๋ฏธ๋ ๊ฒฝ์ฐ - ์ดํ ์์ปจํ ์ธ ๋ฐฉํฅ : targetContentOffset.pointee.x > scrollView.contentOffset.x
์ปจํ ์ธ ๋ฅผ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ๋ฏธ๋ ๊ฒฝ์ฐ - ์ดํ ์ด์ ์ปจํ ์ธ ๋ฐฉํฅ : targetContentOffset.pointee.x < scrollView.contentOffset.x
์กฐ๊ฑด์์ ํ๋ ์์์ผ๋ ์ ์ด ์ค์๋ค
if scrollView.contentOffset.x < targetContentOffset.pointee.x {
// ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ - ์ ์ปจํ
์ธ ๋ฐฉํฅ
} else {
// ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ - ์ด์ ์ปจํ
์ธ ๋ฐฉํฅ
}
๊ทธ๋ฆฌ๊ณ ๋ ํ๋ ์ ์ ์๋ ๊ฒ์ด ์์ด์!
๋๊ฐ ๋ชจ๋ 0๋ฒ์ฌ ์ ์์ 1๋ฒ์งธ ์ ๋ก ์ด๋ํ๋ ๊ฑฐ์์! ์ผ์ชฝ์ ๋์ปฅ ๊ฑฐ๋ฆด ๋, ์ค๋ฅธ์ชฝ์ ์ ๋๋ก ํ์ด์ง์ด ๋์์ ๋
targetContentOffset์ ๊ฒฝ์ฐ ๋น ๋ฅด๊ฒ ์คํฌ๋กค ํ ๊ฒฝ์ฐ ๋ ์์ง์์ด ๋ง๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ํ์ด์ ๋น๊ตํ๊ธฐ ์ ๋งคํ์ง๋ง
์คํฌ๋กค ๋ทฐ์ ์ปจํ ์ธ ์คํ์ scrollView.contentOffset.x ์ ํ์ด์ง์ด ์ ์ฉ๋์ด ๋ฉ์ถ๋ ์ง์ ์ด ๋ฐ๋ targetContentOffset.pointte.x๋ฅผ ๋น๊ตํด ์ค๊ฒ์!
์ผ์ชฝ ๋ถํฐ ๋ด ์๋น! ์๋ ๊ฐ๋ ค๊ณ ํ๋ ๋ฐฉํฅ์ + ๊ฐ ๋๋ ๋ฐฉํฅ์ด์ง๋ง ์ต์ข ์ ์ผ๋ก ๋ฉ์ถ ํฌ์ธํธ๋ ๊ฐ๋ ค๊ณ ํ๋ ๋ฐฉํฅ๋ณด๋ค ์ ์ต๋๋ค
๊ทธ๋ผ ์ ์์ ์ผ๋ก ๊ฐ์ ๋๋ ์คํฌ๋กค ๋์๋ ์ง์ ๋ณด๋ค ํจ์ฌ ์์ ๋ฐฉํฅ์ ๋๋ค
๋ง์ฝ 1๋ฒ์งธ์์ 0๋ฒ์งธ๋ก ์ด๋ํ ๋๋ ์ด์ ๋ฐ๋๋ก ๋ํ๋๊ฒ ์ฃ ?
์กฐ๊ฑด์์ ํ๋ ๋ ์ ์ด ์ค๋๋ค.
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
guard let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else {
return
}
let contentLeftInset = scrollView.contentInset.left
let cellWithSpacing = layout.itemSize.width + layout.minimumLineSpacing
let index = (targetContentOffset.pointee.x + contentLeftInset) / cellWithSpacing
let roundedIndex: CGFloat = round(index)
let adjustOffsetX = roundedIndex * cellWithSpacing - contentLeftInset
if scrollView.contentOffset.x < targetContentOffset.pointee.x {
// ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ - ์ ์ปจํ
์ธ ๋ฐฉํฅ
if scrollView.contentOffset.x > adjustOffsetX {
print("๐๐จ")
} else {
print("๐๐ผ")
}
} else {
// ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ - ์ด์ ์ปจํ
์ธ ๋ฐฉํฅ
if scrollView.contentOffset.x < adjustOffsetX {
print("๐๐จ")
} else {
print("๐๐ผ")
}
}
targetContentOffset.pointee = CGPoint(x: roundedIndex * cellWithSpacing - contentLeftInset, y: scrollView.contentInset.top)
}
์ด๋ ์ฃผ์ ํด์ผ ํ ๊ฒ์ ์ต์ข ํฌ์ธํธ๋ฅผ ๊ณ์ฐํ๊ณ ๋ฐ๋ก ๋์ ํ์ง ๋ง๊ณ ์กฐ๊ฑด๋ฌธ์ ํ ๋ค์ targetContentOffset.pointee์ ์ ์ฉํด ์ฃผ์ ์ผ ํฉ๋๋ค. ๊ทธ๋์ผ ์ฒ์์ ์ ์ด์ค ์กฐ๊ฑด๋ฌธ(scrollView.contentOffset.x < targetContentOffset.pointee.x)์ด ์ ๋๋ก ๋์ํด์!
gif๋ก ๋ฐ๊พธ๋๊น ์ข ๋๋ ค์ก๋๋ฐ ๋์ปฅ ๊ฑฐ๋ฆฌ๋ฉด๐จ์ด ์ฐํ๊ณ ์ ์์ ์ผ๋ก ์ด๋ํ๊ฑฐ๋ ๋ถ๋๋ฝ๊ฒ ๋์ด๊ฐ๋ฉด ๐ผ ์ ๋๋น
if scrollView.contentOffset.x < targetContentOffset.pointee.x {
// ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ - ์ ์ปจํ
์ธ ๋ฐฉํฅ
if scrollView.contentOffset.x > adjustOffsetX {
print("๐๐จ")
} else {
targetContentOffset.pointee = CGPoint(x: adjustOffsetX, y: scrollView.contentInset.top)
}
} else {
// ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ - ์ด์ ์ปจํ
์ธ ๋ฐฉํฅ
if scrollView.contentOffset.x < adjustOffsetX {
print("๐๐จ")
} else {
targetContentOffset.pointee = CGPoint(x: adjustOffsetX, y: scrollView.contentInset.top)
}
}
์ฐ์ ์ ์์ ์ผ๋ก ๋์ํ๋ ๊ณณ์ targetContentOffset์ ๋ณ๊ฒฝํ์ฌ ์ ์์ ์ธ ํ์ด์ง์ด ๋๋๋ก ํด์ค๋๋ค
์ด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ด ์๋ซ ๋์ปฅ ๊ฑฐ๋ฆด ๋ targetContentOffset ์ ์ค์ ํ์ง ์๊ณ
targetContentOffset.pointee = scrollView.contentOffset
์ด ์ฝ๋๋ฅผ ์์ฑํด ์ฃผ๋ฉด ์๊ฐ๋ฝ์ ๋ผ๊ณ ์คํฌ๋กค์ด ๋ฉ์ถ ์ง์ ์ด ์ต์ข ์ง์ ์ด ๋ ๊ฑฐ์์!
์๋๋ ํฑํฑ ๋์์ด์ผ ํ ์ํฉ์์ ์คํฌ๋กค ๋ง์ง๋ง ์ง์ ์์ ๋ฉ์ถ๊ฒ์ ํ์ธ ํ ์ ์์ต๋๋ค ์ด์ ํ ๊ฒ์ ๋ฌด์? ์๋ ํ์ด์ง ๋ ๊ณณ์ผ๋ก ๋ถ๋~๋ฝ๊ฒ ๋์ด๊ฐ๋ฉด ๋๊ฒ ์ฅฌ??!!!
open func setContentOffset(_ contentOffset: CGPoint, animated: Bool)
์ ๋๋ฉ์ด์ ๋ฃ์ด์ค๋ ๋๊ฒ ์ง๋ง ์๋ ์๋ api๋ฅผ ์ฌ์ฉํด ๋ด ์๋ค! contentOffset์ ์ง์ ํ๊ณ animated๋ฅผ ํตํด์ ์ ๋๋ฉ์ด์ ์ ๋ฌด๋ฅผ ๊ฒฐ์ ํ ์ ์์ด์!
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
guard let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else {
return
}
let contentLeftInset = scrollView.contentInset.left
let cellWithSpacing = layout.itemSize.width + layout.minimumLineSpacing
let index = (targetContentOffset.pointee.x + contentLeftInset) / cellWithSpacing
let roundedIndex: CGFloat = round(index)
let adjustOffsetX = roundedIndex * cellWithSpacing - contentLeftInset
let adjustCGPoint = CGPoint(x: adjustOffsetX, y: scrollView.contentInset.top)
if scrollView.contentOffset.x < targetContentOffset.pointee.x {
// ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ - ์ ์ปจํ
์ธ ๋ฐฉํฅ
if scrollView.contentOffset.x > adjustOffsetX {
targetContentOffset.pointee = scrollView.contentOffset
scrollView.setContentOffset(adjustCGPoint, animated: true)
} else {
targetContentOffset.pointee = adjustCGPoint
}
} else {
// ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ด๋ - ์ด์ ์ปจํ
์ธ ๋ฐฉํฅ
if scrollView.contentOffset.x < adjustOffsetX {
targetContentOffset.pointee = scrollView.contentOffset
scrollView.setContentOffset(adjustCGPoint, animated: true)
} else {
targetContentOffset.pointee = adjustCGPoint
}
}
}
๐จ ์๋ ํฑํฑ ๊ฑฐ๋ฆฌ๋ ํ์ด์ง
๐ผ ์์ ๋ ํ์ด์ง
์ง์ง ์ง์ ์คํฌ๋กค ํด๋ณด๋ฉด ์์ ๋ ์ฝ๋๊ฐ ํจ์ฌ ๋ถ๋๋ฌ์์!!!
๐ฆ ์ด์ํ ์ ์ด๋ ์ ๋ชป๋ ๊ฒ์ด ์์ผ๋ฉด ๋๊ธ๋ก ๊ณต์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!!
์ถ์ฒ
iOS_๋ง์คํฐ_์ฒ์ฌ_์ง์ฅ_๋๋ฃ
์ฝ๋ ์ฎ๊ธฐ์ค ๋ ์ถ์ฒ ๋ฐํ ์ฃผ์ธ์ฉ ๐ เ ๐จ ๐ เ ๐จ ๐ เ ๐จ
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] MVVM ๊ฐ๋จํ๊ฒ ์์๋ณด๊ธฐ (0) | 2022.06.04 |
---|---|
[Swift/CoreAnimation] CABasicAnimation ์ด๋ (0) | 2022.06.02 |
[iOS/Swift] Carousel Effect - UIEdgeInset์ด ์๋ UICollectionView ํ์ด์ง ํ๊ธฐ (0) | 2022.05.31 |
[Swift] ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๋ฒ init, property, method (0) | 2022.05.05 |
[Swift] ์์กด์ฑ ์ฃผ์ ์ ํ์ํ ๊น? DI ์์๋ณด๊ธฐ (0) | 2022.04.29 |
๋๊ธ