Frame / Bound
iOS 앱 개발은 결국 화면단 개발이 주가 될 수밖에 없다. 그때 다루게 되는 View. 이러한 뷰들을 여러 가지로 중첩해서 사용하다 보면 만나는 요소 속성인 Frame과 Bounds에 대해서 공부하고, 비교해 보았다.

| 공통점 | 차이점 |
|
|
1. Frame
- Super View 좌표계
- Super View? : View 계층 구조 안에서 현재 View의 하나 윗 계층 View (최상위 View인 루트 View가 아니다!)
| cf) A ㄴ B의 view 구조일 때, B의 Super View는 A |
- origin(x, y) : 속해 있는 바로 위의 Super View에서부터 x ,y만큼 떨어진 값
- size: View 자체의 영역이 아닌, 해당 도형을 감싼 사각형의 width, height
2. Bounds
- 자신의 좌표계
- origin(x, y) : 자신의 원점으로부터 x,y만큼 시점 이동한 값
- size: View 자체의 영역
Frame과 Bounds의 가장 주요한 차이점은 결국 좌표 origin의 기준이 Super View인지 / 자기 자신인지 그리고 size 요소가 회전에 따라 달라지는지 아닌지가 되겠다.
3. origin 값을 변경할 때
그런데 이러한 상대적 - 절대적 origin 값이다 보니, Bounds의 origin 값을 변경할 때 Frame과는 다른 부분이 있어 혼동을 줄 수 있다.
구조 예시
| A ㄴ B ㄴㄴ C |
- A frame의 origin 값을 변경: SubView(B,C)도 그만큼 같이 움직인다
- B bounds의 origin 값을 변경: B는 가만히 있는데 C가 움직인다...?
- bounds의 x, y 좌표를 바꿔준다 = "해당" View를 바라보는 시점의 x, y 좌표 시작점을 바꿔준다
- C frame이 움직인 게 아니라 해당 B View를 바라보는 시점이 변화한 것
Frame 같은 경우 A Frame의 origin 값을 변경하면, 하위에 있는 B와 C도 동시에 함께 움직인다.
그런데 B Bounds의 경우, origin 값을 변경하면 B는 움직이지 않는 반면 그 SubView인 C의 값이 변경한 것과 반대쪽으로 움직이게 된다.
이러한 현상은 Bounds가 시점 기준인 것에서 기인한다.
- 시점 기준이라고?
- 만약 B 50, 50으로 변경했다면 해당 view를 바라보는 시점의 시작점이 0, 0에서 50, 50으로 변경됨
- 따라서 그 아래에 있는 C는 가만히 있음에도 불구하고 -50, -50으로 간 것처럼 보이는 것임
4. 두 가지를 언제 사용하지?
- Frame : UIView의 위치 및 크기를 설정할 때 사용
- Bounds
- View를 회전한 후 View의 실제 크기를 알고 싶을 때 사용
- View 내부에 그림을 그릴 때(drawRect) 사용한다
- ScrollView에서 스크롤을 할 때 사용
- ScrollView
- ScrollView의 contentOffset - ScrollView의 bounds를 설정하는 값
가장 흥미로웠던 부분은 3번 이었는데, 우리가 ScrollView를 사용할때 부여하는 contentOffset 속성이 해당 ScrollView에게 bounds를 설정하는 값이었다는 사실이다.
Frame과 Bound의 비교를 통해 사용법을 정확히 숙지하고, 앱 개발 시 적절한 시점에 활용하면 좋겠다.