๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฑ Mobile/iOS

[iOS - UIKit] Compositional Layout - CollectionView

Compositional Layout 

CollectionView์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. ๊ณตํ†ต์ ์ธ cell์˜ ํ˜•ํƒœ๋ณด๋‹ค๋Š” ๋‹ค์–‘ํ•œ ์‚ฌ์ด์ฆˆ์˜ cell๋“ค์„ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค. 

Compositional Layout์€ CollectionView Layout ์ค‘ ํ•˜๋‚˜์ด๋‹ค. (FlowLayout ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.)

 

 

 

์œ„์™€ ๊ฐ™์ด item, group, section์„ ์ง€์ •ํ•ด์„œ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ cell๋“ค์„ ์‰ฝ๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 

Section ์•ˆ์— Group, Group ์•ˆ์— Item, Item์€ Cell ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค

 

 

๊ธฐ๋ณธ์ ์ธ Compositional Layout ์ฝ”๋“œ 

func createBasicListLayout() -> UICollectionViewLayout { 
    let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),                                  
                                         heightDimension: .fractionalHeight(1.0))    
    let item = NSCollectionLayoutItem(layoutSize: itemSize)  
  
    let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),                                          
                                          heightDimension: .absolute(44))    
    let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize,                                                   
                                                     subitems: [item])  
  
    let section = NSCollectionLayoutSection(group: group)    

    let layout = UICollectionViewCompositionalLayout(section: section)    
    return layout
}

 

 

 

NSCollectionLayoutSize

item์˜ height์™€ width๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

 

1. absolute (CGFloat)

๋ง ๊ทธ๋Œ€๋กœ ์ ˆ๋Œ€ ํฌ๊ธฐ์ด๋‹ค. ํ•ญ์ƒ ๊ณ ์ •๋œ ํฌ๊ธฐ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.

 

let absoluteSize = NSCollectionLayoutSize(widthDimension: .absolute(44), heightDimension: .absolute(44))

 

 

2. estimated(CGFloat)

๋Ÿฐํƒ€์ž„์— ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ estimated๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์‹œ์Šคํ…œ์ด ์˜ˆ์ƒ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์ œ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

 

let estimatedSize = NSCollectionLayoutSize(widthDimension: .estimated(200), heightDimension: .estimated(100))

 

 

3. fractionalWidth(CGFloat), fractionalHeight(CGFloat)

ํ˜„์žฌ ์ž์‹ ์ด ์†ํ•œ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋น„์œจ๋กœ์จ ์ž์‹ ์˜ ํฌ๊ธฐ๋ฅผ ์ •ํ•œ๋‹ค.

0.0~1.0 ์‚ฌ์ด์˜ CGFloat๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

 

let fractionalSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.2), heightDimension: .fractionalWidth(0.2))

 

 

 

 

sectionNumber์— ๋”ฐ๋ฅธ section ์ƒ์„ฑ

static func create() -> UICollectionViewCompositionalLayout {
        return UICollectionViewCompositionalLayout { (sectionNumber, _ environment) -> NSCollectionLayoutSection? in
            let section: NSCollectionLayoutSection
            switch sectionNumber {
            case 0:
                section = createMainSection()
            case 1:
                section = createUserClipSection()
            case 2:
                section = createWeeklyLinkSection()
            case 3:
                section = createWeeklyRecommendSection()
            default:
                section = createMainSection()
            }
            return section
        }
    }

 

item, group, section ์žก๊ธฐ 

static func createUserClipSection() -> NSCollectionLayoutSection {
        let itemFractionalWidthFraction = 1.0 / 2.0
        let itemInset: CGFloat = 7
        
        // item
        let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(itemFractionalWidthFraction),
                                              heightDimension: .absolute(150))
        let item = NSCollectionLayoutItem(layoutSize: itemSize)
        item.contentInsets = NSDirectionalEdgeInsets(top: itemInset, leading: itemInset, bottom: itemInset, trailing: itemInset)
        
        // group
        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1),
                                               heightDimension: .absolute(268))
        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
        
        // section
        let section = NSCollectionLayoutSection(group: group)
        section.contentInsets = NSDirectionalEdgeInsets(top: itemInset, leading: itemInset, bottom: itemInset, trailing: itemInset)
        return section
    }

 

 

Header, Footer ์žก๊ธฐ

// Header, Footer
section.boundarySupplementaryItems = [
	NSCollectionLayoutBoundarySupplementaryItem(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(50)), elementKind: UICollectionView.elementKindSectionHeader, alignment: .top),
    	NSCollectionLayoutBoundarySupplementaryItem(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(20)), elementKind: UICollectionView.elementKindSectionFooter, alignment: .bottom)
]

 

 

 

item๋“ค ์‚ฌ์ด์— ๊ฐ„๊ฒฉ ๋„์šฐ๊ธฐ 

let itemInset: CGFloat = 0
        
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(itemFractionalWidthFraction),
                                              heightDimension: .fractionalHeight(1))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
item.contentInsets = NSDirectionalEdgeInsets(top: itemInset,
                                             leading: itemInset,
                                             bottom: itemInset,
                                             trailing: itemInset)

 

 

 

 

 

 

728x90