250x250
반응형
05-14 04:24
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Notice
Recent Posts
Recent Comments
Link
Archives
관리 메뉴

Bill Kim's Life...

[Swift] UIScrollView 내의 컨텐츠 크기에 맞춰서 동적으로 스크롤 영역 크기 설정(UIScorllView 동적 컨텐츠 크기 설정) 본문

DEV Tips/iOS

[Swift] UIScrollView 내의 컨텐츠 크기에 맞춰서 동적으로 스크롤 영역 크기 설정(UIScorllView 동적 컨텐츠 크기 설정)

billnjoyce 2021. 1. 10. 17:04
728x90
반응형

[이슈 내용]

 

UIScrollView를 사용하여 스크롤 가능하는 화면을 구성할 경우 스크롤의 영역의 크기를 설정해야 화면 스크롤이 가능합니다.

보통은 UIScrollView 내의 컨트롤을 화면을 출력하기 전에 구성을 완료하고 화면 진입을 하기 때문에 화면의 크기를 아래의 코드로 적절하게 원하는 크기로 설정하면 됩니다.

 

scrollview.contentSize = CGSize(width: self.frame.width, height: 500)

 

하지만 UIScrollView 내의 컨트롤을 동적으로 생성 및 변경을 하는 상황에서는 위의 코드처럼 한번에 크기를 지정하면 동적으로 추가한 컨트롤이 만약 컨텐츠 사이즈를 벗어나서 생성할 경우 스크롤 영역을 벗어날 생성되어 추가된 컨트롤을 제대로 볼 수가 없습니다.

 

오늘 소개해드릴 Swift 팁은 바로 동적으로 UIScrollView 내의 컨트롤을 동적으로 추가할 경우 자동적으로 스크롤의 영역을 변경해주는 팁을 알아보겠습니다.

 

 

[해결 방법]

 

바로 아래와 같이 UIScrollView 객체에 대한 extension을 선언합니다.

 

그리고 동적으로 변경을 원하는 스크롤뷰에서 updateContentSize 함수를 호출하면 자동적으로 스크롤 뷰에 있는 자식 컨트롤들의 영역을 계산하여 동적으로 스크롤뷰의 컨텐츠 사이즈를 업데이트 합니다.

extension UIScrollView {
    func updateContentSize() {
        let unionCalculatedTotalRect = recursiveUnionInDepthFor(view: self)
        
        // 계산된 크기로 컨텐츠 사이즈 설정
        self.contentSize = CGSize(width: self.frame.width, height: unionCalculatedTotalRect.height+50)
    }
    
    private func recursiveUnionInDepthFor(view: UIView) -> CGRect {
        var totalRect: CGRect = .zero
        
		// 모든 자식 View의 컨트롤의 크기를 재귀적으로 호출하며 최종 영역의 크기를 설정
        for subView in view.subviews {
            totalRect = totalRect.union(recursiveUnionInDepthFor(view: subView)) 
        }
        
		// 최종 계산 영역의 크기를 반환
        return totalRect.union(view.frame)
    }
}

// 코드 사용 시
scrollview.updateContentSize()

 

오늘은 Swift와 관련하여 동적(Dynamic) UIScrollView 컨텐츠 사이즈 설정하는 방법을 한번 소개해드렸습니다.

그럼 즐거운 iOS 개발을 하시길 바랍니다.

 

감사합니다.

728x90
반응형
Comments