카테고리 없음

[iOS] Frame과 Bound를 비교해 보자

인포-팟 2024. 6. 28. 01:36

 

Frame / Bound 

 

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

 

Frame과 Bounds의 영역차이

 

공통점 차이점
  • CGRect로 구성
    • CGRect : 높이와 너비 (CGSize) 그리고 origin(원점, CGPoint)
    • CGSize : 높이와 너비
  • origin(x, y)의 기준 
  • size(width, height)의 기준 

 

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과는 다른 부분이 있어 혼동을 줄 수 있다. 

 

구조 예시 


ㄴ 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 
  1. View를 회전한 후 View의 실제 크기를 알고 싶을 때 사용
  2. View 내부에 그림을 그릴 때(drawRect) 사용한다
  3. ScrollView에서 스크롤을 할 때 사용 

 

  • ScrollView
    • ScrollView의 contentOffset - ScrollView의 bounds를 설정하는 값

 

가장 흥미로웠던 부분은 3번 이었는데, 우리가 ScrollView를 사용할때 부여하는 contentOffset 속성이 해당 ScrollView에게 bounds를 설정하는 값이었다는 사실이다.

 

Frame과 Bound의 비교를 통해 사용법을 정확히 숙지하고, 앱 개발 시 적절한 시점에 활용하면 좋겠다.