UIView frame, bounds 그리고 좌표변환

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:

* Reference : 아이폰 프로그래밍 UIKit 핵심 바이블

Advertisements
Leave a comment

1 Comment

  1. cpromise

     /  January 10, 2016

    bounds가 자기자신에 대한 기준의 좌표값을 갖는다면 항상 0,0일텐데 굳이 CGRect타입인 이유가 있을까요?
    frame과 bounds에 대한 차이의 이해가 너무 어렵네요..ㅠㅠ

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: