도래울

UIView frame, bounds 그리고 좌표 본문

개발/iOS

UIView frame, bounds 그리고 좌표

도래울 2016. 5. 4. 09:21

UIView 좌표에 대한 기초 내용을 정리해보자 . 기초가 튼튼해야 응용도 가능하다.

CGPoint 와 CGRect

UIView 는 사각형으로 기준점과 너비,높이로 위치와 크기가 결정된다. 기준점은 사각형의 좌측 꼭지점이다.

위치와 크기를 표현하는데 CGPoint 와 CGRect  구조체가 사용된다.

CGPoint 는 (x,y) 값을 통해 좌표를 나타내며, CGRect 은 (x, y, width, height ) 값을 통해 위치와 크기를 표현하다.

편의상 CGRect 은 x, y, width, height 로 표현하였다. 실제 CGRect 은  CGPoint 와 CGSize 를 갖는다. CGSize 는 width와 height 를 갖는 구조체다.

frame 과 bounds

UIView는 특정 UIView (UIWindow 도 UIView 의 서브클래스) 의 자식요소로 포함됨으로써 화면에 표시된다 . [UIView addSubview:] 메소드를 실수로 누락하면 UIView 가 의도한대로 화면에 표시되지 않는다.

자식 요소로 추가될 UIView 는 자신이 보여질 위치와 크기가 결정되어야 한다. 자식 요소 위치의 기준점은 부모요소의 기준점으로부터 계산된다. UIView의 위치와 크기는 일반적으로  frame 속성을 통해 결정되며, 이를 위해 UIView는 initWithFrame: 초기화 메소드를 제공한다.

UIView는 frame외에 bounds  속성을 가진다. 두 속성 모두 CGRect 타입으로 위치와 크기를 나타내지만 의미하는 바는 조금 다르다. 아래 그림을 보자.

< from iOS developer library >

UIWindow 와 UIImageView(이미지를 컨텐츠로 갖는 UIView)로 구성된 화면이다. UIImageView 는 UIWindow 의 자식요소이다. UIImageView 의 frame 과 bounds 값은 다음과 같다. – ( x, y, width, height ) 로 표시

  • frame : (40, 40, 240, 380)
  • bounds : (0,0, 240, 380)

frame 과 bounds 의 너비, 높이 값은 (240,380)으로 동일하나 (x,y)좌표는 다르다.

frame 의 좌표는 부모요소를 기준으로 한다. 위 화면에서UIImageView는 UIWindow 기준점으로부터 x 축으로 40, y 축으로 40 만큼 떨어진 지점에 위치함으로 frame 의 (x,y) 좌표는 (40,40) 이 된다.

반면에 bounds 는 자신을 기준으로 한다. 따라서 (x,y) 는 (0,0) 을 가진다. 일반적으로  bounds 값은 (0,0,width,height) 이다.

frame  속성은 UIView 위치나 크기를 설정하는 경우에 사용하고, bounds 속성은 자신의 내부에 뭔가를 그릴 떄나 자신 영역 내에 어느 위치가 터치되었는가를 판정하는 경우등에 사용한다.

좌표변환

좌표는 기준점에 따라 다른 값을 가진다.  특정 기준의 좌표를 다른 기준으로 변환해야 될 경우가 있다. 아래 그림을 보자

좌표변환

포인트 C 와  UIView A, UIView B 가 있다. A 를 기준으로 한 C 좌표를 (Cxa, Cya) , B를 기준으로 한 C 좌표를 (Cxb, Cyb) 라 하자. 만약 (Cxa, Cya) 값만 알고 있고, 이 값을 통해 (Cxb, Cyb) 를 계산해야 하는 경우가 있다면 어떻게 할 수 있을까? 반대 경우라면 어떻게 할 수 있을까?

UIView의 여러 메소드을 통해 이 값을 구할 수 있다.

  • -(CGPoint)convertPoint:(CGPoint) point toView: (UIView*) view;
  • -(CGPoint)convertPoint:(CGPoint) point fromView:(UIView*) view;

예시 경우에 적용해보자.

A 기준의 C 좌표를 B 기준으로 변환하면 ,

(Cxb, Cyb) = [A convertPoint:(Cxa,Cya) toView:B]

반대로 B 기준의 C 좌표를 A 기준으로 변환하면,

(Cxa, Cya) = [A convertPoint:(Cxb, Cyb) fromView:B]

좌표 CGPoint 외에 CGRect 도 변환 가능하다. 메소드는 다음과 같고 사용법은 위와 동일하다.

  • convertRect: toView;
  • convertRect: fromView:

UIWindow도 비슷한 메소드를 제공한다. UIWindow 를 기준으로 이용하면 화면 전체의 절대좌표(?) 비슷한 의미로 사용할 수 있다.

  • convertPoint: toWindow:
  • convertRect: toWindow:
  • convertPoint: fromWindow:
  • convertRect: fromWindow:


Comments