Post

UIKit - Frame과 Bounds란?

UIKit - Frame과 Bounds란?

이 글과 이어지는 내용임.

Frame

frame은 부모 뷰(superview)를 기준으로 어떤 뷰가 어떤 위치(origin)에 있고 얼만큼의 공간(size)을 차지하고 있는지 나타냄.

ViewController.swift

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
import UIKit

class ViewController: UIViewController {

    private let uiView = {
        
        let rect = CGRect(x: 100, y: 200, width: 200, height: 200)
        
        // frame 설정
        let view = UIView(frame: rect)
        
        view.backgroundColor = .green
        
        return view
        
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.addSubview(uiView)
        
        print("frame : \(uiView.frame)")
    }
}

출력 결과

1
frame : (100.0, 200.0, 200.0, 200.0)

origin: 부모 뷰의 원점(0, 0)을 기준으로 얼마나 떨어져 있는지를 나타냄

image

size: 뷰가 실제로 차지하는 직사각형의 크기

image

transform(회전, 스케일) 등을 적용하면, 뷰가 차지하는 물리적인 영역이 달라지기 때문에 frame.size는 바뀔 수 있음.

image

Bounds

bounds는 자기 자신을 기준으로 하는 내부 좌표계임.

ViewController.swift

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
import UIKit

class ViewController: UIViewController {

    private let uiView = {
        
        let rect = CGRect(x: 100, y: 200, width: 200, height: 200)
        
        // frame 설정
        let view = UIView(frame: rect)
        
        view.backgroundColor = .green
        
        return view
        
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.addSubview(uiView)
        
        print("frame : \(uiView.bounds)")
    }
}

출력 결과

1
frame : (0.0, 0.0, 200.0, 200.0)

origin: 항상 자기 자신이 기준이기 때문에 기본값(0, 0)

image

size: 해당 뷰의 본래 크기

image

transform을 해도 bounds.size는 그대로 유지됨.

image

Bounds의 origin 변경

boundsorigin을 변경해도 뷰 자체는 움직이지 않음.

대신, 뷰가 보여질 영역(viewport)이 움직이게 됨.

즉, 내부 콘텐츠를 어느 부분부터 보여줄지 결정하는 값임.

대표적인 예시로는 UIScrollView가 있음.

UIScrollView는 이 bounds.origin을 통해 화면을 스크롤할 때 origin 값을 변경하여 실제로 화면에 표시되는 콘텐츠를 제어함.

Reference

This post is licensed under CC BY 4.0 by the author.