Apple 개발자 문서에서는 frame
과 bounds
속성을 다음과 같이 정의하고 있다.
frame
은 superview의 좌표계에서 현재 view의 위치 및 크기를 나타낸다.
bounds
는 자기 자신의 좌표계를 기준으로 view의 위치 및 크기를 나타낸다.
즉, 두 속성은 기준 좌표계에 차이가 있다.
frame
의 origin
은 superview 좌표계의 원점을 기준으로 현재 view의 원점이 얼마만큼 떨어져 있는지를 나타낸다.
bounds
의 origin
은 자기 자신의 좌표계를 기준으로 하므로, 항상 (0, 0)
으로 초기화된다.
위 그림에서, View B의 frame.origin
은 superview인 View A의 좌표계를 기준으로 원점으로부터의 거리((10, 20)
)를 나타내고 있다. 반면, View B의 bounds.origin
은 (0, 0)
으로 초기화되었다.
frame
의 size
는 superview 좌표계에서 현재 view가 차지하고 있는 사각형 영역의 크기를 나타낸다.
bounds
의 size
는 자기 자신 좌표계에서의 크기를 나타낸다.
위 그림에서, View B를 회전시키면 frame.size
는 superview인 View A에서 볼 때 View B가 차지하는 영역을 나타내므로 기존 크기((70, 50)
)에서 width height이 증가했다. 반면, bounds.size
는 자기 자신의 좌표계를 기준으로 하므로 View B가 화전될 때 자기 자신 좌표계도 회전하여 원래 크기((70, 50)
)를 유지한다.
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)
만큼 이동한 것처럼 보이게 된다.