본문 바로가기
교육/아이폰 앱 개발 기초 과정

[2010.7.17 (토)] 아이폰 앱 개발 기초 과정 (셋째날)

by 호군 2010. 9. 10.
반응형
 강의 마지막날... 모두들 제 시간에는 오시지 않았다. 그래서 조금 있다 교육을 시작하게 되었다. 그리고 첫째날에 교육을 위한 맥북을 다시 반납해야하니 아깝다는 생각도 든다. 사무실 쪽에서는 관리가 힘들다고 맥북을 수강생들에게 보관을 하라고해서 흠집이라도 나면 어쩌나 걱정이 되었던게 사실이다. 그래서 한편으론 반납해야 하는 맥북이기에 무사히 반납할 수 있다는 안도감도 든다. 오늘 수업에서 배우게 되는 것은 코어 그래픽스와 애니메이션 그리고 맞춤형 테이블 뷰이다. 그럼 마지막 날의 아이폰 앱 개발 기초 과정의 수업을 정리해 보겠다.

1. 코어 그래픽스(Core Graphics)
 코어 그래픽스는 아이폰의 2차원 그래픽 라이브러리이다. 코어 그래픽스보다 좀 더 큰 개념의 용어가 있는데 쿼츠라는 용어이다. 애플이 사용하는 쿼츠의 개념은 하나의 라이브러리가 아니라 아이폰의 그래픽 라이브러리의 총칭이다. 아이폰에서의 쿼츠는 코어 그래픽스와 코어 애니메이션으로 구성된다. 그리고 이 쿼츠는 코코아 터치 API의 아래에서 코코아 터치를 받쳐준다. 아래 그림을 보면 아이폰에서의 쿼츠의 레벨을 알 수 있다.

  1.1 코어 그래픽스의 사전지식
    - 코어 그래픽스는 C API이다. 오브젝트-C에서는 alloc을 하면 release를 해줘야 한다. 
      마찬가지로 코어 그래픽스는 C API를 사용하기 때문에 메소드에 Create가 있으면 오브젝트
      를 만들어서 리턴한다는 의미로 사용후에 릴리즈 해주어야 한다.
    - 코어 그래픽스는 비트맵과 벡터 방식에 모두 친숙해야 한다. 아이폰은 기복적으로 벡터
      방식이지만 화면에 뿌려지기 위해서는 래스터라이징(rasterizing)되어야 하기 때문이다.
      비트맵은 그림이 들어갈 크기를 미리 정해 놓고, 표현할 점의 개수를 설정한 뒤 각각의 점
      (픽셀, pixel)에 대한 컬러값을 조정하여 그림을 표현하는 방식이다.
      벡터 드로잉 방식은 가상의 공간속에서 위치값을 가진 점들을 연결시켜 선을 만들거나
      베지어(Bezier) 함수와 같은 수학 함수를 이용하여 곡선을 그리는 방식이다. 
    - 코어 그래픽스는 보통 CGColorSpaceCreateDeviceRGB라는 컬러 스페이스를 사용한다. 
      RGB방식이므로 모든값이 0.0 이면 검은색이 되며, 모든값이 1.0 이면 흰색이 된다.
    - 선형대수 책을 다시 펼쳐보자. 

  1.2 코어 그래픽스에서 사용되는 CGRect 구조체
    CGRect는 코어 그래픽스에서 사각형을 설정하는 방식으로, 위치정보를 가지고 있는
    CGPoint 구조체와 크기정보를 가지고 있는 CGSize 구조체를 함께 가지고 있다.

  1.3 프레임(Frame)과 바운즈(Bounds)
    프레임과 바운즈는 둘 다 CGRect를 사용하는 뷰의 프로퍼티이다. 이 둘의 개념은 서로 달라
    서 정확히 이해하고 있지 않으면 혼동하기 쉽다. 이 둘을 구분하는 기준은 어느 뷰가 기준인
    지 알면 쉽게 이해 할 수 있다. 프레임은 SuperView가 기준이고, 바운즈는 현재 자신의 View
    가 기준이다. 그럼 프레임과 바운즈의 정의를 알아보록 한다.
    프레임은 뷰의 슈퍼 뷰에서 원점 위치와 크기이다.
    바운즈는 뷰 오브젝트 자신의 내부 좌표계에 정의되는 원점 위치와 크기이다.
    그림을 보면 더 쉽게 이해 할 수 있지만 'iPhone SDK 튜토리얼' 서적을 참고하기 바란다.

  1.4 컨텍스트(Context)
    컨텍스트는 코어 그래픽스에서 그림을 그리는 영역이다. 컨텍스트는 그림이 그려질 곳에 
   상관이 없다. 화면상의 뷰여도 상관없고, 화면 밖의 임의의 비트맵 컨텍스트여도 상관없으며
   심지어 프린터에 바로 뿌져질 수 도 있다.
  
   - 코드
CGBitmapContextCreate(void* data, size_t width, size_t height, size_t bitsPerComponent
              , size_t bytesPerRow, CGColorSpaceRef colorspace, CGBitmapInfo bitmapInfo)
매개변수로 넘어온 프레임 크기만큼의 32비트 컬러 비트맵 컨텍스트를 만든다. API가 예전보다 많이 유연해져서 비트맵 데이터가 저장되는 위치가 중요하지 않다면, 첫번째 매개변수인 data에 NULL을 넣는것이 편리하다. 여섯번째 매개변수인 colorspace는 컬러스페이스로
CGColorSpaceCreateDeviceRGB 함수를 이용해서 디바이스의 RGB 컬러 스페이스를 쉽게
얻어올수있다.
CGContextRealse(CGContextRef context)
사용을 마친 컨테스트는 릴리즈한다.

1.5 터치 이벤트
  사용자가 아이폰 화면을 터치하면 이벤트가 발생을 한다. 이 때 화면에 보이는 모든 오브젝트는 UIView의 서브클래스이다. 그리고 이 UIView 오브젝트는 UIResponder의 서브클래스이다. UIResponder 클래스는 이벤트 처리를 위한 클래스이다. 그래서 모든 UIView 오브젝트를 상속 받은 서브 클래스들은 이벤트 처리를 할 수 있다. 아래 그림은 UIKit의 주요 클래스 계층도 이다.
머리속에 넣어두자.

UIResponder 클래스는 뷰 오브젝트가 터치 이벤트를 처리할 수 있도록 메소드를 제공한다.
 - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
 - (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
 - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
위와 같은 3개의 메소드는 스크린을 터치했을 때, 터치 후 움직였을 때, 터치가 막 스크린을 떠났을 때 호출된다. 이러한 사용자 손가락의 상태를 터치 페이즈(Phase)라고 한다.
이 메소드를 사용하려면 View 클래스에 각 메소드를 오버라이드해서 이벤트를 처리하면 된다.


1.6 뷰 그리기
  윈도우를 개발했다면 OnDraw라는 메소드를 알 것이다. 이 메소드와 동일한 기능을 하는 UIView 오브젝트의 가장 중요한 메소드가 -drawRect 메소드이다. 화면이 다시 그려져야 할 때 이 메소드가 호출되어 화면에 그려준게 된다. 그리고 호출 또한 윈도우 OnDraw메소드와 비슷하게 직접 호출 대신 setNeedsDispaly라는 메소드를 통해 호출 할 수 있다. 물론 윈도우에서는 setNeedsDisplay가 아니라 Invalide라는 메소드를 통해서 한다.

- 코드
- (void)drawRect:(CGRect)rect {
    ....

1.7 코어 그래픽스 레이어
  코어 그래픽스에는 CGLayer라는 오브젝트가 있다. CGLayer 오브젝트를 이용해서 구현하면 비트맵 컨텍스트를 이용하는 것보다 효율적이다. 이미지나 도형을 반복해서 그려내는 경우 쿼츠(Quzrtz)가 CGLayer 오브젝트를 비디오 메모리에 캐싱할 수 있기 때문에 보다 빠르고 효율적으로 동작한다. 

  CGLayer 오브젝트는 초기화 시에 컨텍스트를 필요로 한다. 주의할 점은 이 컨텍스트의 참조점을 가지는 것이 아니라 컨텍스트와 동일한 별도의 컨텍스트를 가지는 것이다. 아래는 CGLayer를 생성하는 메소드이다.

- 코드
CGLayerCreateWithContext(CGContextRef context, CGSize size, CFDictionaryRef auxiliaryInfo)


반응형