[iOS] Bounds 와 Frame 의 차이점

민경준·2023년 11월 28일
0

🌟 Declaration

우선 frame과 bounds의 설명을 보자.

둘 다 UIView의 instance이며, UIView의 위치와 크기를 나타낸다.
위치와 크기는 각각 origin과 size라는 instance로 존재하며, x/y 좌표 및 width/height를 표현한다.

여기까지 보면 거의 똑같아 보이지만 단 한가지 차이점이 있다.
frame은 superview를 기준으로 한 coordinate system에 대한 정보이고,
bounds는 자신을 기준으로 한 coordinate system을 표현한 정보이다.

🌟 Discussion

🔥 frame

그럼, 실제로 어떻게 작동하는지 봐야한다.
우선 frame 부터 살펴보자.

frame의 핵심은 superview를 기준으로 한다는 것이고, subview에 변형이 있을 때 없을때의 차이를 보면된다.

📌 변형이 없을 때

변형이 없을 때는 그냥 superview를 기준으로 좌표 값과 사이즈를 보면된다.
origin (x: 70, y: 40)
size (widht: 210, height: 110)

📌 변형이 있을 때

origin (x: 10, y: 30)
size (widht: 350, height: 200)

이게 무슨 일인가?
위 사진에서 subview에 회전만 줬을 뿐인데 frame의 size 값이 바뀌었다.

위에서 언급한대로 frame의 핵심은 superview를 기준으로 한다는 것이다.
즉, width와 height도 superview를 기준으로 측정한다.

왜? subview들의 frame은 모두 superview의 coordinate system을 따르기 때문에
좌표, 사이즈 모든것을 superview를 기준으로 측정하게 된다.

🔥 bounds

bounds의 핵심은 coordinate system이 자기 자신의 것이라는 점이다.
이 점은 scrollView 작동의 핵심 이기도 하고, bounds의 좌표를 변경했을때 차이를 보도록 하자.

📌 변형이 없을 때

origin (x: 0, y: 0)
size (widht: 200, height: 200)

frame과 마찬가지로 그냥 자기 자신을 기준으로 좌표와 사이즈를 보면 된다.
또한, 회전을 하더라도 사이즈나 좌표는 변하지 않는다.

왜? coordinate system이 자기 자신의 것이니까.

📌 변형이 있을 때

이게 무슨일인가?
자신의 bounds 좌표를 바꿨는데 자식 뷰의 위치가 이동했다.

이것을 이해 하려면 우선 각 view는 모두 자신만의 고유 좌표계가 있다는 사실을 생각해야 한다.
즉, bounds의 좌표를 변경한것은 자신의 좌표계 안에서 본인의 위치를 이동한다는 의미이다.
좌표계에서 어떻게 움직이는지 그림으로 확인해보자.

bounds의 x/y 좌표가 0,0일 때는 이런 모습이다.
여기서 좌표를 바꿔주면 어떤 모습일지 보자.

자식뷰의 좌표는 그대로 멈춰있고, 본인의 위치가 바뀌었다.
그런데 실제 화면에는 마치 자식뷰가 이동한것처럼 보인다.

그러니까 실제로는 해당 view의 window가 움직인것이지 자식뷰가 이동한게 아니다.
window의 위치가 바뀌니 우리 눈에는 상대적으로 자식뷰가 이동한것처럼 보이는것 뿐이고
자식뷰의 frame을 확인해보면 좌표값은 그대로 고정되어 있다.

📌 scrollView

이래서 bounds는 scrollView의 핵심이라고 할 수 있는데
아이패드에서 스크롤을 한다고 생각해보자.

위와 같이 스크롤을 할 수 있는 화면이 존재 할때, 우리가 파란 원을 보고 싶으면 왼쪽으로 당겨서 스크롤해야 한다.
이렇게 스크롤 했을 때 우리 눈에는 네모와 원이 움직인것 처럼 보이지만
실제로는 scrollView의 bounds 좌표를 변경해준것이고 그에 따라 window가 움직이니 옆에 안보이던 원이 보이게 되는 원리이다.











Reference

profile
iOS Developer 💻

0개의 댓글