[iOS] Frame과 Bounds 차이

Joey·2022년 2월 6일
0

Apple 개발자 문서에서는 framebounds 속성을 다음과 같이 정의하고 있다.

  • Frame : The frame rectangle, which describes the view’s location and size in its superview’s coordinate system.
  • Bounds : The bounds rectangle, which describes the view’s location and size in its own coordinate system.

frame은 superview의 좌표계에서 현재 view의 위치 및 크기를 나타낸다.
bounds는 자기 자신의 좌표계를 기준으로 view의 위치 및 크기를 나타낸다.

즉, 두 속성은 기준 좌표계에 차이가 있다.

원점과 크기 비교

원점(Origin)

frameorigin은 superview 좌표계의 원점을 기준으로 현재 view의 원점이 얼마만큼 떨어져 있는지를 나타낸다.
boundsorigin은 자기 자신의 좌표계를 기준으로 하므로, 항상 (0, 0)으로 초기화된다.

위 그림에서, View B의 frame.origin은 superview인 View A의 좌표계를 기준으로 원점으로부터의 거리((10, 20))를 나타내고 있다. 반면, View B의 bounds.origin(0, 0)으로 초기화되었다.

크기(Size)

framesize는 superview 좌표계에서 현재 view가 차지하고 있는 사각형 영역의 크기를 나타낸다.
boundssize는 자기 자신 좌표계에서의 크기를 나타낸다.

위 그림에서, View B를 회전시키면 frame.size는 superview인 View A에서 볼 때 View B가 차지하는 영역을 나타내므로 기존 크기((70, 50))에서 width height이 증가했다. 반면, bounds.size는 자기 자신의 좌표계를 기준으로 하므로 View B가 화전될 때 자기 자신 좌표계도 회전하여 원래 크기((70, 50))를 유지한다.

View의 이동

View에서 frame.origin(x, y)만큼 이동하면 해당 view의 subview들도 (x, y)만큼 이동하는 것처럼 보인다.
하지만, subview의 frame.origin 값이 달라지지는 않는데, subview의 frame.origin은 현재 view(subview 입장에서는 superview)의 원점으로부터의 위치를 나타내기 때문이다.
Subview는 superview 안에서는 항상 같은 위치에 그려지고 있다.

반면에, bounds의 원점을 이동시키면 전혀 다른 결과를 보여준다.
bounds.origin(x, y)만큼 이동시키면, 실제 view의 위치가 변하지 않고 그 subview들이 (-x, -y)만큼 이동한 것 처럼 보인다.
'이동한 것 처럼 보인다'는 것은 화면상에서는 (-x, -y)만큼 움직였지만, 실제 frame.origin이나 bounds.origin값은 바뀌지 않았다는 것을 의미한다.

이런 결과는 bounds자기 자신의 좌표계를 기준으로 하기 때문에 발생한다. bounds의 원점 좌표가 (x, y)만큼 이동하면 subview들을 view의 좌표계가 (x, y)만큼 이동했을 때의 위치로 다시 렌더링한다. 결과적으로, subview의 입장에서는 (-x, -y)만큼 이동한 것처럼 보이게 된다.

profile
software engineer

0개의 댓글