Search
Duplicate

Bounds VS Frame

Created
2023/10/08 05:30
Tags
iOS
태그

️ Bounds와 Frame

extension UIView { open var frame: CGRect open var bounds: CGRect }
Swift
복사
CGRect는 View의 위치(origin)와 크기(size)를 나타내기 위해 사용한다.

 frame과 bounds는 View의 위치와 크기를 나타낸다!

하지만, 새로운 View에 CGRect를 하나 만들어 frame과 bounds를 각각 출력해보면,
frame과 bounds의 size(width, height)는 동일하지만, origin(x, y) 값이 다름을 확인할 수 있다.
frame과 bounds는 어떻게 다를까?

 Frame

SuperView의 coordinate system 안의 뷰의 location과 size를 설명해주는 frame rectangle
Super View 좌표계에서 View의 위치와 크기를 나타낸다.

Super View란?

View로 화면을 구성할 때 계층 구조 라는 것이 존재한다.
최상위 View → 루트 View
이 루트 View 안의 하위 구조에서 계속해서 새로운 View들을 놓을 수 있다.
Super VIew란, 이 계층 구조에서 현재 내 View의 한칸 위의 계층 View를 말하는 것이다.
secondView의 Super View는 바로 한 칸 위의 계층인 firstView가 되는 것이다.

frame의 origin(x, y)

frame이 나타내는 origin(x, y) 좌표 Super View의 원점을 (0, 0)으로 놓고, 원점으로부터 얼마나 떨어져 있는지를 나타낸 것이다 (원점 = View의 가장 왼쪽, 가장 윗 부분을 말한다)
 Super View의 원점으로부터 얼마큼 떨어져 있는가 이다!
이렇듯, frame의 경우, origin을 Super View의 좌표계에서 나타낸다.

frame의 size(width, height)

frame의 sizeView 영역을 모두 감싸는 사각형으로 나타낸 것 이다.
이렇게 width = 200, height = 130인 View가 있을 때, 이 View의 frame.size를 출력해보면
frame width = 200.0, height = 130.0
Shell
복사
이렇게 출력이 된다.
하지만,
이런식으로 기울인다면, View 영역을 모두 감싸는 사각형이기 때문에
frame width = 238.0, height = 213.0
Shell
복사
이렇게 변하게 된다. 그래서 핵심은,
 frame의 sizeView 자체의 크기가 아니라, View가 차지하는 영역을 감싸서 만든 사각형이다.
그러면 이렇게 회전 시켜 주었을 때, 진짜 View의 size(200, 130)는 알 수가 없을까? → 이때 사용하는 것이 바로 bounds 이다.

 Bounds

→ 자신의 좌표계에서 View의 위치와 크기를 나타낸다.
frame이 Super View의 좌표계 였다면, bounds는 자신의 좌표계 라고 할 수 있다.

bounds의 origin(x, y)

bounds의 좌표계는 frame과 달리 Super View와는 아무 상관이 없으며 기준이 자기 자신이라고 했다.
이 말은, 자신의 원점을 (0, 0)으로 놓는다 는 말이다.
때문에, View를 처음 생성하면 bounds의 origin은 무조건
bounds x = 0.0, y = 0.0
Shell
복사
이렇게 (0, 0)으로 초기화 되어 있다.
그러면 bounds의 origin은 무슨 의미가 있을까?
ScrollView의 ContentOffset 처럼 bounds를 바꿔주어야 하는 경우를 보면, 왜 bounds가 필요한지 알 수 있다.
일단 핵심은,
 bounds의 origin은 자신의 좌표계를 기준으로 삼고, 처음엔 (0, 0)으로 초기화 되어진다.

 bounds의 size(width, height)

bounds의 size는 View 자체의 영역을 나타낸 것 이다.
아까 frame과는 달리 bounds의 size는 회전시켜도 size가 바뀌지 않는다.
왜냐하면 bounds는 View 자체의 영역을 나타내기 때문이다.
그렇다면, bounds의 origin은 변할까? 변하지 않는다!
왜냐하면 bounds는 시작점이 자신의 원점이기 때문에, View가 회전하든 안하든 자신의 원점이 곧 좌표의 시작점이다.

️ 요약

frame
bounds
origin(x, y) 기준점
Spuer View의 좌표계
자신의 좌표계
size(width, height) 기준
View 영역을 모두 감싸는 사각형
View 영역 자체

 Bounds와 Frame의 차이점을 설명하시오.

→ Bounds와 Frame 모두 View의 위치와 사이즈를 반환하는 CGRect의 타입 변수이다. 차이점은 Frame은 해당 뷰가 상위 뷰의 좌표계를 기준으로 정해진 크기와 좌표라는 점이고, Bounds는 자기 자신의 좌표계를 기점으로 정해진 크기와 좌표라는 점이다.

 Reference