Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

potato's iOS Story/๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋งŒ๋‚œ ์นœ๊ตฌ๋“ค

[UIKit] UIPageControl์„ ์‚ฌ์šฉํ•ด์„œ UIView ์ „ํ™˜ํ•˜๊ธฐ (feat. ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ์‚ฌ๊ณ ๋ฅผ ํ•ด๋ณด๋‹ค)

๊ฐ์ž ๐Ÿฅ” 2022. 12. 2. 03:32
๋ฐ˜์‘ํ˜•

๐Ÿ“ฑ ๋‚ด๊ฐ€ ๋‹ด๋‹นํ•œ ๋ทฐ

๋‚˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ทฐ๋ฅผ ๋‹ด๋‹นํ–ˆ๊ณ , ํ•ด๋‹น ๋ทฐ๋Š” ์Šคํฌ๋กค์ด ๋…ํŠนํ•œ ๋ฐฉ์‹์œผ๋กœ ์ ์šฉ๋œ๋‹ค. ์–ด๋–ค ๋ฐฉ์‹์ด๋ƒ๋ฉด, ๊ทธ ์•„๋ž˜ ํ™”๋ฉด์ฒ˜๋Ÿผ, ์ผ์ • ์Šคํฌ๋กค์ด ๋˜๋ฉด ์‡ฝ! ์ž๋™์œผ๋กœ ๋„˜์–ด๊ฐ€์•ผํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋„˜์–ด๊ฐ€์•ผํ–ˆ๋‹ค.

design by. ์•ˆ์€์ง€ (Berry)

๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผํ•  ํ™”๋ฉด์€, ์ด ๋‘ ํ™”๋ฉด์ด๊ณ , ์•„๋ž˜๋กœ ๋‚ด๋ฆฌ๋ฉด, ์˜ค๋ฅธ์ชฝํ™”๋ฉด์ด, ์œ„๋กœ ์˜ฌ๋ฆฌ๋ฉด ์™ผ์ชฝํ™”๋ฉด์ด ๋‚˜์™€์•ผํ–ˆ๋‹ค. ํ•ด๋‹น ๋ทฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ–ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋‹ค์–‘ํ•œ ๋ฐฉ์‹์„ ์ƒ๊ฐํ–ˆ๋‹ค. (์‚ฌ์‹ค ์ •๋ง ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์ด ์žˆ์—ˆ์ง€๋งŒ, ํ•ด๋‹น ๋ฐฉ์‹์„ ์ ‘ํ•ด๋ณด์ง€ ๋ชปํ–ˆ๋˜ ๋‚˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐˆ๋ž˜ ๊ธธ์—์„œ ํ—ค๋งธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.)

 

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 ์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด ํ™”๋ฉด ์ด๋™์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์•˜๋‹ค!

 

๊ตฌํ˜„

  1. ์šฐ์„  ๋ทฐ์—์„œ ํ•„์š”ํ•œ ํ”„๋กœํผํ‹ฐ๋“ค์„ ๋ชจ๋‘ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
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://fomaios.tistory.com/entry/Swift-%EC%8A%A4%ED%81%AC%EB%A1%A4%EB%B7%B0%EB%A1%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%8E%98%EC%9D%B4%EC%A7%80%EC%B2%98%EB%9F%BC-%EB%84%98%EA%B8%B0%EA%B8%B0Image-Paging-with-UIScrollView

 

[iOS/UI] Swift ์Šคํฌ๋กค๋ทฐ๋กœ ์ด๋ฏธ์ง€ ํŽ˜์ด์ง€์ฒ˜๋Ÿผ ๋„˜๊ธฐ๊ธฐ(Image Paging with UIScrollView)

์•ˆ๋…•ํ•˜์„ธ์š” Foma ์ž…๋‹ˆ๋‹ค!! ์˜ค๋Š˜์€ ์Šคํฌ๋กค๋ทฐ๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ ํŽ˜์ด์ง€์ฒ˜๋Ÿผ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ๊ฑด๋ฐ์š”. ํ‰์†Œ์—๋Š” ์ปฌ๋ ‰์…˜๋ทฐ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ด๋ฏธ์ง€ ํŽ˜์ด์ง•์„ ํ–ˆ์—ˆ๋Š”๋ฐ ์Šคํฌ๋กค๋ทฐ๋กœ ํ•˜๋Š”๊ฒƒ

fomaios.tistory.com

https://ios-development.tistory.com/397

 

[iOS - swift] PageControl, UIScrollView, ์•ˆ๋‚ดํ™”๋ฉด

์›๋ฆฌ ScrollView์˜ frame์€ UIScreen.main.bounds์™€ ๊ฐ™๊ฒŒํ•œ ํ›„ contentSize๋ฅผ pageControl์˜ ๊ฐฏ์ˆ˜๋งŒํผ * UIScreen.main.bounds.width ๋ฐฐ์น˜: scrollView๋ฅผ ๋จผ์ € ์ถ”๊ฐ€ -> scrollView์˜ ํฌ๊ธฐ๋ฅผ ์ž ์‹œ ์ถ•์†Œ -> PageControl์ถ”๊ฐ€ -> srollView ํฌ

ios-development.tistory.com

https://eunjin3786.tistory.com/203

 

[UICollectionView] Paging / Carousel / Snap Collectionview with header, footer

์ด ๊ธ€์˜ ๋ชฉ์ ์€ header, footer๊ฐ€ ์žˆ๋Š” collectionview๋ฅผ Paging ๋˜๋Š” Carousel ๋˜๋Š” Snap ํ•˜๊ธฐ--!! ์ธ๋ฐ์š”, ์ ์ง„์ ์œผ๋กœ(??) ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. [1] cell ๊ฐ„ spacing์ด ์—†๋Š” CollectionView (ํ™”๋ฉด ์‚ฌ์ด์ฆˆ์™€ cell ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ฐ™์€

eunjin3786.tistory.com

 

๋ฐ˜์‘ํ˜•