์๋ ํ์ธ์~
์ค๋์ CollectionView์์ ์ ๋ค์ ์ผ์ชฝ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋ค๊ฐ
๊ด์ฐฎ์ ๋ฐฉ๋ฒ์ด ์์ด ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค.
๋จผ์ ์ฌ์ฉํ๊ฒ ๋
UICollectionViewFlowLayout์ ๋ํด์ ๊ฐ๋ตํ ์๊ฐํ๊ณ ์์ํ๊ฒ ์ต๋๋ค.
FlowLayout
- UICollectionViewFlowLayout ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ์ ์ ์ํ๋ ํํ๋ก ์ ๋ ฌํ ์ ์๋ค.
- FlowLayout์ ๋ ์ด์์ ๊ฐ์ฒด๊ฐ ์ ์ ์ ํ ๊ฒฝ๋ก์ ๋ฐฐ์นํ๊ณ ์ต๋ํ ๋ง์ ์ ์ ์ฑ์ฐ๋ ๊ฒ์ ๋งํฉ๋๋ค.
- ํ์ฌ ํ์์ ๋ ์ด์์ ๊ฐ์ฒด์ ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ์๋ก์ด ํ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
์ญํ
- ํ๋ก์ฐ ๋ ์ด์์ ๊ฐ์ฒด๋ฅผ ์์ฑํด ์ปฌ๋ ์ ๋ทฐ์ ๋ ์ด์์ ๊ฐ์ฒด๋ก ์ง์
- ์ ์ ๋๋น์ ๋์ด๋ฅผ ๊ตฌ์ฑ
- ์ ์ ๊ฐ๊ฒฉ์ ์กฐ์
- ์น์ ์ ํค๋ ํน์ ์น์ ํธํฐ๋ฅผ ํฌ๊ธฐ๋ฅผ ์ง์
- ์คํฌ๋กค ๋ฐฉํฅ์ ์ค์
์์ฑ
์๋์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด Attributes๋ ์ด 5๊ฐ์ง์ ๋ฉ์๋๋ฅผ ์ด์ฉํด
์ , ํค๋, ํธํฐ์ ๋๋น, ๋์ด, ๊ฐ๊ฒฉ ๋ฑ์ ์ง์ ํด ์ค ์ ์์ต๋๋ค.
์ผ์ชฝ ์ ๋ ฌ์ ํ๊ธฐ ์ํด ์ฒซ ๋ฒ์งธ ๋ฉ์๋์ธ ForElements๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
๋ง์ฝ ์์ดํ ๋ณ๋ก ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํ๊ฑฐ๋ ๊ฐ๊ฒฉ ๋ฑ์ ์กฐ์ ํ๊ณ ์ถ๋ค๋ฉด ForItem์ ์ฌ์ฉํ์๋ฉด ๋๊ณ
ํค๋ ํน์ ํธํฐ๋ฅผ ์กฐ์ ํ๊ณ ์ถ๋ค๋ฉด SupplementaryView๋ฅผ
์ปฌ๋ ์ ๋ทฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ทฐ๋ฅผ ์กฐ์ ํ๊ณ ์ถ๋ค๋ฉด DecorationView๋ฅผ ํ์ฉํ์๋ฉด ๋ฉ๋๋ค.
๋์ค์ ๊ธฐํ๊ฐ ๋๋ค๋ฉด ๋๋จธ์ง ๋ฉ์๋์ ์ปฌ๋ ์ ๋ทฐ์ ๋ํด ์์ธํ ๋ด์ฉ์ ํฌ์คํ ํด ๋ณด๊ฒ ์ต๋๋ค : - )
๋ฐฉ๋ฒ
ํ๋ก์ฐ ๋ ์ด์์ ๊ฐ์ฒด๋ฅผ ํ๋๋ฅผ ๋ง๋ค๊ณ , ์์ ๋งํ ForElements ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
// Left Aligned
class LeftAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributes = super.layoutAttributesForElements(in: rect)
var leftMargin = sectionInset.left
var maxY: CGFloat = -1.0
attributes?.forEach { layoutAttribute in
if layoutAttribute.representedElementKind == nil {
if layoutAttribute.frame.origin.y >= maxY {
leftMargin = sectionInset.left
}
layoutAttribute.frame.origin.x = leftMargin
leftMargin += layoutAttribute.frame.width + minimumInteritemSpacing
maxY = max(layoutAttribute.frame.maxY, maxY)
}
}
return attributes
}
}
์์ ์ฝ๋๋ Cell์ ์ผ์ชฝ ์ ๋ ฌํ๊ธฐ ์ํด ForElement๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ๊ตฌํํ ๊ฒ์ ๋๋ค.
์ฝ๋๋ฅผ ํ๋์ฉ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. attributes๋ฅผ ์ ์ธํ๊ณ ํ๊ณ super ํด๋์ค์ Attribute๋ฅผ ๊ฐ์ง๊ณ ์ต๋๋ค.
let attributes = super.layoutAttributesForElements(in: rect)
2. leftMargin์ ์ด๊ธฐ Section.left์ผ๋ก ์ฃผ๋ ์ด์ ๋ ์์์ ์ ์น์
์ ์ผ์ชฝ ์ธ์
๊ณผ ๊ฐ์ ๊ฐ์ ์ฃผ๊ธฐ ์ํด์์
๋๋ค. ํ๋กํผํฐ๋ฅผ ๋น๊ตํด ๊ฐ๋ฉด์ ํ์ด ๋ฐ๋๋ฉด ๋ค์ ๊ฐ์ ๊ฐ์ผ๋ก ๋์์ค๊ฒ ๋์ฃ .
var leftMargin = sectionInset.left
if layoutAttribute.frame.origin.y >= maxY {
leftMargin = sectionInset.left
}
3. maxY๋ 0 ์ดํ์ ๊ฐ์ผ๋ก ์์ํด ์ ์ ๊ฐ yํฌ์ง์ ์ ๋น๊ตํด ๊ฐ๋ฉด์ yํฌ์ง์ ์ ๊ด๋ฆฌํ๋ ๋ณ์๋ผ๊ณ ์๊ฐํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ์ ์ ํ์ด ๋ค์์ธ์ง ์๋์ง ๋น๊ตํ๊ธฐ ์ํด max ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋น๊ตํ๊ณ ๋ค์ ํ์ผ๋ก ๋์ด๊ฐ๊ฒ ๋๋ ์๋ฆฌ์ ๋๋ค.
var maxY: CGFloat = -1.0
maxY = max(layoutAttribute.frame.maxY, maxY)
4. leftMargin์ ์ด์ฉํด ๊ฐ ์ ์ xํฌ์ง์ ์ ์ ํด์ฃผ๊ณ ํด๋น ์ ์ ๋์ด์ ๊ฐ๊ฒฉ์ ๋ํด๊ฐ๋ฉด์ ๋ค์ ์์น๋ฅผ ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
layoutAttribute.frame.origin.x = leftMargin
leftMargin += layoutAttribute.frame.width + minimumInteritemSpacing
5. ์ ์ฉ
์์ฑํ FlowLayout์ CollectionView์ ์ ์ฉํด ์ฃผ์๋ฉด ๋ฉ๋๋ค.
let collectionView: UICollectionView = {
let layout = LeftAlignedCollectionViewFlowLayout()
layout.minimumLineSpacing = 10
layout.minimumInteritemSpacing = 10
let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
return collectionView
}
์ ๋ฆฌ
์ ์ฝ๋๋ฅผ ๊ตฌํํ๊ณ ํ์ธํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์ด ์ผ์ชฝ ์ ๋ ฌ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
[ ๋ด๊ฐ ํ๊ณ ์ถ์ ] ์น์ ์ ๋ณด๋ฉด
[ ์ฝ๋ฉ ] , [ ์ํผํ์ค! ] , [ ๊ฒ์ ] ๊ทธ๋ค์ ์ค๊ฒ ๋๋ ๊ฒ์ด [ ์์ฃผ, ๊ฐ๋ฌด, ๊ฒ์ ]์ธ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
[ ์์ฃผ, ๊ฐ๋ฌด, ๊ฒ์ ] ์ ์ด ์ฐจ์งํ๋ ๊ณต๊ฐ์ด [ ๊ฒ์ ] ๋ค์ ์ฌ ์ ์๊ฒ ๋๋ ์์ฐ์ค๋ฝ๊ฒ ๋ค์ ํ์ผ๋ก ๋์ด๊ฐ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
์์ ์ค๋ช ํ๋
"ํ์ฌ ํ์์ ๋ ์ด์์ ๊ฐ์ฒด์ ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ์๋ก์ด ํ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค."์ ๊ฐ์ ํน์ฑ ๋๋ฌธ์ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก
์ผ์ชฝ์ ๊ธฐ์ค์ ์ ๋ง๋ค์ด์ฃผ๊ณ ์ฐจ๊ณก์ฐจ๊ณก ์์๊ฐ๋ค
์ ์ ๊ธธ์ด๊ฐ ๋ ์ด์์์ ๋ฒ์๋ฅผ ์ด๊ณผํ๋ค๋ฉด ๋ค์ํ์ผ๋ก
๋ค์ ์ผ์ชฝ ๊ธฐ์ค์ ์ ๋ง๋ค์ด ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ ๊ฒ์ ๋๋ค.
UICollectionView์ ์ ๋ค์ ์ผ์ชฝ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ ์์ฑํด ๋ดค์ต๋๋ค.
์กฐ๊ธ ๋ ํธํ ๋ฐฉ๋ฒ์ด ์๊ฑฐ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋๊ธ ๋ฌ์์ฃผ์ธ์.
๊ฐ์ฌํฉ๋๋ค.
๊ทธ๋ผ ์ด๋ง ๐๐ป ๐๐ป ๐๐ป
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[swift] Timer๋ฅผ ํ์ฉํ API ๋ฐ๋ณตํธ์ถ ๋ฐฉ๋ฒ (0) | 2022.02.16 |
---|---|
[swift] SnapKit์ ๋ํด์ ( + update Constraints ์ด์) (0) | 2022.02.15 |
[Swift] ๋๋ ์คํ์์ค์ ๊ธฐ์ฌํด๋ณด๊ณ ์ถ๋ค (๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ ๋ฐฉ๋ฒ) (0) | 2022.02.08 |
[Swift] Moya๋ฅผ ์ฌ์ฉํด๋ด ์๋ค. (0) | 2022.02.07 |
[Swift] R.swift SPM์ผ๋ก ์ค์นํด๋ณด๊ธฐ (0) | 2022.02.06 |