iOS

[ iOS ] ์‚ฌ์ง„ ์„ ํƒ ์‹œ ๋ฒˆํ˜ธ ํ‘œ๊ธฐ(๋„˜๋ฒ„๋ง) ๊ตฌํ˜„ (+ collectionView)

Forest Yun 2022. 6. 15. 19:23
728x90

๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

 

 

 

๋ฌธ์ œ

์‚ฌ์ง„ ์„ ํƒ ์‹œ ๋ฒˆํ˜ธ ํ‘œ๊ธฐ(๋„˜๋ฒ„๋ง) ๊ตฌํ˜„ํ•˜๊ธฐ. ํŠน์ • ์‚ฌ์ง„ ์„ ํƒ ํ•ด์ œ ์‹œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ „์ฒด ๋ฒˆํ˜ธ ํ‘œ๊ธฐ์— ๋ฐ˜์˜๋˜์–ด์•ผ ํ•œ๋‹ค.

 

 

 

1. cell ๋‚ด ๋ฒ„ํŠผ ์„ ํƒ ์ด๋ฒคํŠธ

2. ํŠน์ • ์‚ฌ์ง„ ์„ ํƒ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๊ธฐ

3. ํŠน์ • ์‚ฌ์ง„ ์„ ํƒ ํ•ด์ œํ•˜๊ธฐ

4. ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ฒฝํ—˜ํ–ˆ๋˜ ์˜ค๋ฅ˜

5. ๊ฐœ์„ ํ•  ๋งŒํ•œ ๋ถ€๋ถ„

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

1. cell ๋‚ด ๋ฒ„ํŠผ ์„ ํƒ ์ด๋ฒคํŠธ

 

[ iOS ] cell ๋‚ด ๋ฒ„ํŠผ ์„ ํƒ ์ด๋ฒคํŠธ ๊ตฌํ˜„ (+ Delegate ํŒจํ„ด)

๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ ์‚ฌ์ง„ ๋‚ด ๋ฒ„ํŠผ ์„ ํƒํ•˜๊ธฐ 1.  cell ๋‚ด ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ UICollectionViewControllerDelegate์˜ collectionView(_:didSelectItemAt:) ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด collectionView C..

88yhtserof.tistory.com

 

 

 

 

 

 

 

 

 

 

2. ํŠน์ • ์‚ฌ์ง„ ์„ ํƒ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๊ธฐ

ํด๋ž˜์Šค์— ์ „์ฒด ์‚ฌ์ง„์ด ๋“  ๋ฐฐ์—ด๊ณผ ์„ ํƒ๋œ ์‚ฌ์ง„์ด ๋‹ด๊ธธ ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ๋‹ค.

//ImagePickerViewController.swift

class ImagePickerViewController: UIViewController {
    ...
    var selectedImages: [UIImage] = []
    var images: [ImageData] = []
    ...
}

 

์—ฌ๊ธฐ์„œ images ๋ฐฐ์—ด์˜ ํƒ€์ž…์€ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋งŒ๋“  ImageData๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์‚ฌ์ง„์ด ์„ ํƒ๋  ๊ฒฝ์šฐ, ๋ช‡ ๋ฒˆ์งธ๋กœ ์„ ํƒ๋˜์—ˆ๋Š”์ง€ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด selectedNumber ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค. ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ด๋ฏ€๋กœ Intํ˜•์ด์ง€๋งŒ ์„ ํƒ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์—๋Š” ๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ ์˜ต์…”๋„๋กœ ์„ ์–ธํ•œ๋‹ค.

//ImageData.swift

struct ImageData {
    let image: UIImage
    var selectedNumber: Int?
}

 

์‚ฌ์ง„ ๋‚ด ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์—์„œ ํŠน์ • ์‚ฌ์ง„ ์„ ํƒ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๊ธฐ  ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜์ž. 

UICollectionViewControllerDataSource์˜ collectionView(_:cellForItemAt:) ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด cell์„ ๊ตฌ์„ฑํ•  ๋•Œ, ImageCollectionViewCell์˜ index ํ”„๋กœํผํ‹ฐ์— cell์˜ row ์ˆœ์„œ๋ฅผ ์ €์žฅํ•˜์—ฌ ํ•ด๋‹น ์‚ฌ์ง„์ด images ๋ฐฐ์—ด์˜ ๋ช‡ ๋ฒˆ์งธ์— ์œ„์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์ž. ๋งŒ์•ฝ ์„ ํƒ๋œ ์ ์ด ์—†๋‹ค๋ฉด, ํ•ด๋‹น ์‚ฌ์ง„์„ selectedImages ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜๊ณ  selectedNumber์— ๋ช‡ ๋ฒˆ์งธ๋กœ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•œ๋‹ค.

//ImagePickerViewController.swift

extension ImagePickerViewController: ImageCollectionViewCellDelegate {
    func didSelectCountButton(_ cell: ImageCollectionViewCell) {
        if images[cell.index].selectedNumber != nil {
            
        } else {
            let image = images[cell.index].image
            selectedImages.append(image)
            images[cell.index].selectedNumber = selectedImages.count //0๋ฒˆ์งธ๋ถ€ํ„ฐ ํ• ๋‹นํ•ด๋„ ๋œ๋‹ค
        }
        imageCollectionView.reloadData()
    }
}

 

 

 

 

 

 

 

 

3. ํŠน์ • ์‚ฌ์ง„ ์„ ํƒ ํ•ด์ œํ•˜๊ธฐ

ํŠน์ • ์‚ฌ์ง„์„ ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…์€ ๊ฐ„๋‹จํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์„ ํƒ์ด ํ•ด์ œ๋˜์—ˆ์„ ์‹œ ์ด๋Ÿฌํ•œ ๋ณ€ํ™”๊ฐ€ ๋ฒˆํ˜ธ ํ‘œ๊ธฐ์— ๋ฐ˜์˜๋˜์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ) ๊ฐ€1-๋‚˜2-๋‹ค3-๋ผ4 => ๋‹ค3 ์ œ๊ฑฐ => ๊ฐ€1-๋‚˜2-๋ผ3

 

ํ•ด๋‹น ์‚ฌ์ง„์ด ์„ ํƒ๋œ ์ ์ด ์žˆ๋‹ค๋ฉด selectedImages ๋ฐฐ์—ด์—์„œ ํ•ด๋‹น ์‚ฌ์ง„์ด ์ œ๊ฑฐ๋œ๋‹ค. ๊ทผ๋ฐ ๋งŒ์•ฝ ๋งˆ์ง€๋ง‰ ์‚ฌ์ง„์ด ์•„๋‹Œ ์ค‘๊ฐ„ ์ˆœ์„œ์˜ ์‚ฌ์ง„์ด ์‚ญ์ œ๋œ๋‹ค๋ฉด ์„ ํƒ ํ•ด์ œ๋œ ์‚ฌ์ง„์˜ ๋ฒˆํ˜ธ ์ด์ƒ์˜ ๋ฒˆํ˜ธ๋ถ€ํ„ฐ ํ‘œ๊ธฐ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค. A์˜ if๋ฌธ์€ ๊ทธ๋Ÿฌํ•œ ์กฐ๊ฑด์— ํ•ด๋‹นํ•œ ๊ฒฝ์šฐ ๊ทธ๋Ÿฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ๋ฝ์ด๋‹ค.

extension ImagePickerViewController: ImageCollectionViewCellDelegate {
    func didSelectCountButton(_ cell: ImageCollectionViewCell) {
        if images[cell.index].selectedNumber != nil {
            guard let selectedNumber = images[cell.index].selectedNumber else {return}
            selectedImages.remove(at: selectedNumber - 1)
            
            if selectedNumber <= selectedImages.count { //A
                images = images.map{
                    guard var number = $0.selectedNumber else {return ImageData(image: $0.image, selectedNumber: nil)}
                    if number > selectedNumber {
                        number -= 1
                    }
                    return ImageData(image: $0.image, selectedNumber: number)
                }
            }
            
            images[cell.index].selectedNumber = nil
        } else {
            ...
        }
        imageCollectionView.reloadData()
    }
}

 

 

 

 

 

 

 

 

 

4. ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ฒฝํ—˜ํ–ˆ๋˜ ์˜ค๋ฅ˜

์ „์ฒด ์‚ฌ์ง„์ด ๋‹ด๊ธด images ๋ฐฐ์—ด๊ณผ ์„ ํƒ๋œ ์‚ฌ์ง„์ด ๋‹ด๊ธด selectesImages ๋ฐฐ์—ด์„ ๊ฐ€์ง€๊ณ  ์‚ฌ์ง„ ์„ ํƒ ์‹œ ๋ฒˆํ˜ธ ํ‘œ๊ธฐ(๋„˜๋ฒ„๋ง) ๊ตฌํ˜„ํ•˜๊ธฐ ์ „, ๊ฐ cell์˜ ImageCollectionViewCell.swift์— ์„ ํƒ๋œ ์ˆœ์„œ๋ฅผ selectedIndex์— ๋‹ด์•„ ๊ตฌํ˜„์„ ์‹œ๋„ํ–ˆ์—ˆ๋‹ค.

์ฒ˜์Œ์—” ์ž˜ ์ž‘๋™ํ•œ๋‹ค ํŒ๋‹จ๋˜์—ˆ์ง€๋งŒ, ์Šคํฌ๋กค์„ ์›€์ง์—ฌ ๋ณด๋‹ˆ ์„ ํƒํ•˜์ง€ ์•Š์€ ์‚ฌ์ง„์ด ์„ ํƒ๋˜์—ˆ๋‹ค๊ณ  ํ‘œ์‹œ๋˜๊ฑฐ๋‚˜ ์ˆซ์ž๊ฐ€ ์„ž์ด๋Š” ๋“ฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ด์œ ๋Š” ๋‚ด ์ƒ๊ฐ์— cell ์ƒ์„ฑ ์‹œ collectionView์˜ dequeueReusableCell(withReuseIdentifier:for:) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๋‹ค.

dequeueReusableCell(withReuseIdentifier:for:)
identifier์—์„œ ์ฐพ์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ cell ๊ฐ์ฒด๋ฅผ ํ์—์„œ ๋บ€๋‹ค.

 

dequeueReusableCell(withReuseIdentifier:for:)๋Š” collectionView์—์„œ ์ƒˆ cell์„ ์š”์ฒญํ•  ๋•Œ DataSource๋กœ๋ถ€ํ„ฐ ํ˜ธ์ถœ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์Šคํฌ๋กค์„ ์ด๋™์‹œ์ผœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ cell์„ ์š”์ฒญ๋ฐ›์œผ๋ฉด ์ƒˆ๋กญ๊ฒŒ cell์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ์กด์žฌํ•˜๋Š” cell ์ค‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ collectionView์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธฐ์กด cell์„ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ cell์˜ prepareForReuse() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ๋ฐ”๋กœ ์ด ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

prepareForReuse()
๋ทฐ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.  (any clean up necessary)

์œ„ ๋ฉ”์„œ๋“œ๋Š” cell์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ cell์„ ์ •๋ฆฌํ•œ๋‹ค. ์ฆ‰, ์„ ํƒ๋œ ์‚ฌ์ง„ cell์ด ์Šคํฌ๋กค์ด ๋˜๋ฉด์„œ ์ •๋ฆฌ๋ผ ์žฌ์‚ฌ์šฉ๋˜์–ด์„œ ์Šคํฌ๋กค์„ ํ•˜๋ฉด ์„ ํƒ๋œ ์‚ฌ์ง„์˜ cell์ด ๋‹ค๋ฅธ ์‚ฌ์ง„์˜ cell์ด ๋˜์–ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์ง„์„ ๊ฐ๊ฐ์˜ ์ƒํƒœ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋”ฐ๋กœ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

 

 

์ง€๊ธˆ๊นŒ์ง€ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•œ ๋ฐ”๋กœ๋Š” ์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ ํ•ด๋‹น ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ, ๊ทธ๋ ‡๋‹ค๋ฉด index ํ”„๋กœํผํ‹ฐ๋Š” ์™œ ์˜ํ–ฅ์ด ์—†์„๊นŒ? ์•„์ง ๋” ๊ณต๋ถ€ํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

 

 

 

 

5. ๊ฐœ์„ ํ•  ๋งŒํ•œ ๋ถ€๋ถ„

ํ˜„์žฌ ์ž‘์—…์€ Swift์—์„œ ์ œ๊ณตํ•˜๋Š” Collectionํƒ€์ž…์ธ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์—์„œ insert, remove ๋“ฑ๊ณผ ๊ฐ™์€ ์ž‘์—…์€ O(n) ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ๋ฐฐ์—ด์˜ ์‚ฌ์šฉ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋‹จ์ ์€ LinkedList ๋˜๋Š” ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์ถ”ํ›„ ์ˆ˜์ •์„ ํ†ตํ•ด ๊ฐœ์„ ํ•ด๋ณด๋„๋ก ํ•˜์ž.

 

๊ทธ๋ฆฌ๊ณ  ์„ ํƒ ๋˜๋Š” ์„ ํƒ ํ•ด์ œ ์‹œ CollectionView.reload()๋ฅผ ์‚ฌ์šฉํ•ด collectionView๋ฅผ ๊ฐฑ์‹ ํ–ˆ๋Š”๋ฐ, ์ถ”๊ฐ€ ๋˜๋Š” ์ œ๊ฑฐ ์‹œ ์‚ฌ์šฉ๋˜๋Š” collectionView์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ณต๋ถ€ํ•ด ์ˆ˜์ •ํ•˜์ž.

 

 

 

 

 

 

 

 

 


 

 

 

728x90