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)을 기준으로 얼마나 떨어져 있는지를 나타냄
size: 뷰가 실제로 차지하는 직사각형의 크기
transform(회전, 스케일) 등을 적용하면, 뷰가 차지하는 물리적인 영역이 달라지기 때문에 frame.size는 바뀔 수 있음.
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)
size: 해당 뷰의 본래 크기
transform을 해도 bounds.size는 그대로 유지됨.
Bounds의 origin 변경
bounds의 origin을 변경해도 뷰 자체는 움직이지 않음.
대신, 뷰가 보여질 영역(viewport)이 움직이게 됨.
즉, 내부 콘텐츠를 어느 부분부터 보여줄지 결정하는 값임.
대표적인 예시로는 UIScrollView가 있음.
UIScrollView는 이 bounds.origin을 통해 화면을 스크롤할 때 origin 값을 변경하여 실제로 화면에 표시되는 콘텐츠를 제어함.
Reference
This post is licensed under CC BY 4.0 by the author.




