What is Core Animation

OSXDEV

Jump to: navigation, 찾기

Core Animation Programming Guide로 이동


코어 애니메이션은 렌더링, 프로젝션과 애니메이션을 위한 Objective-C 클래스들의 집합이다. 어플리케이션 키트 뷰의 구조를 알고 있는 개발자에게 친숙한 개념인 계층 레이어 구조를 유지하면서 진보적인 코어 이미지 기반의 시각적인 효과를 이용해 부드러운 애니메이션을 제공한다.

역동적으로 움직이는 사용자 인터페이스는 만들기가 어렵다. 하지만 코어 애니메이션은 다음과 같은 기능을 제공하여 그런 인터페이스 제작을 보다 쉽게 한다.

  • 간단히 접근할 수 있는 프로그래밍 모델로 고성능의 합성
  • 친숙한 NSView와 유사한 개념. 복잡한 사용자 인터페이스를 레이어 오브젝트의 계층 구조로 만들수 있도록 한다.
  • 가벼운 데이터 구조. 수백개의 레이어들을 동시에 디스플레이 하고 애니메이트 할 수 있다.
  • 어플리케이션의 런 루프에 독립적인, 분리된 쓰레드에서 애니메이션이 돌아가도록 하는 추상적인abstract 애니메이션 인터페이스. 애니메이션을 설정하고 시작하면, 코어 애니메이션이 프레임 율에 맞게 돌리는 모든 책임을 진다.
  • 향상된 어플리케이션 퍼포먼스. 어플리케이션들은 내용이 변할 때 그것을 다시 그려주기만 하면 된다. 사이즈 조정과 레이아웃 서비스 레이어를 제공하기 위해 최소한의 어플리케이션과의 상호작용은 필요하다. 코어 애니메이션은 애니메이션 프레임 율에 따라 동작하는 어플리케이션 코드 또한 없앤다.
  • 레이어의 위치와 크기가 인접 레이어들의 어트리뷰트에 상대적인 방식으로 설정되도록 하는 관리자를 가진, 유연한 레이아웃 관리자 모델.

코어 애니메이션을 사용하면, 개발자들은 자신의 어플리케이션에 역동적인 프로트-로우 스타일의 사용자 인터페이스와 유사한 애니메이션 퍼포먼스를 OpenGL과 같은 낮은 레벨의 크래픽스 API를 사용하지 않고도 만들 수 있다. 코어 애니메이션은 게임, 슬라이드 쇼 혹은 프리젠테이션 어플리케이션에도 이용할 수 있다.

코어 애니메이션은 코어 이미지, 코어 비디오, 쿼츠 컴포저, 퀵타임 그리고 쿼츠 윈도우 서버와 연동해서, 광범위한 시각적 결과물을 얻어내는 데 그 기술을 사용할 수 있게 한다. 코어 애니메이션은 그 전혀 다른 그래픽스 모델들의 모든 레이어 타입을 반아들이는 통합 이미징 모델을 제공한다. 레이어 트리는 쿼츠 컴포저 컴포지션, OpenGL 렌더링, 퀵타임 무비, 코어 이미지 필터 효과 그리고 전통적인 쿼츠로 그린 레이어등의 어떤 조합이라도 뷰를 이용해서 지금까지 해 왔던 것 보다 훨씬 더 손쉽게 가능하게 한다.


목차

[편집] 코어 애니메이션 클래스들

코어 애니메이션 클래스들을 다음과 같은 몇개의 카테고리로 묶을 수 있다.

  • 디스플레이를 위한 컨텐트를 제공하는 레이어 클래스들
  • 애니메이션과 타이밍 클래스들
  • 레이아웃과 컨스트레인트(묶기) 클래스들
  • 다중의 레이어들의 변화를 하나의 아토믹 업데이트로 그룹짓는 트랜젝션 클래스

기본적인 코어 애니메이션 클래스들은 Quzrtz Core 프레임워크에 포함되어 있으며, 부가적인 클래스들은 다른 프레임워크에 정의되어 있을 수도 있다. "코어 애니메이션 클래스 계층도"는 코어 애니메이션 클래스들의 계층도를 보여준다.


그림 1. 코어 애니메이션 클래스 계층도 그림:A_CoreAnimation_Lk_class_hierarchy.jpg


[편집] 레이어 클래스들

레이어 클래스들은 코어 애니메이션의 기반이며 NSView를 사용해 온 개발자들에게 친숙한 개념을 제공한다. 기본적인 레이어 기능은 모든 타입의 코어 애니메이션 레이어들의 부모 클래스인 CALayer 클래스에 의해 제공된다.

NSView의 인스턴스처럼, CALayer 인스턴스는 하나의 부모 레이어(슈퍼레이어)를 가지고 있고, 레이어 트리로 참조되는 레이어의 계층구조를 만드는 서브레이어들의 집합을 가지고 있다. 레이어들은 뷰처럼 뒤쪽에서부터 앞쪽으로 그려지며 그 슈퍼레이어에 대해 로컬 좌표계를 만들면서, 상대적인 위치값을 지정한다. 그러나, 레이어는 회전, 기울이기, 크기조정 등의 변형 행렬과 연계되고 그 레이어 컨텐트를 영사(project)함으로서 보다 복잡하게 시각적 디스플레이를 한다. 레이어의 위치와 변형에 대한 보다 자세한 논의는 "Layer Geometry and Transforms"에서 한다.

CALayer는 NSView에서 나왔기 때문에 컨텐트를 디스플레이 하기 위해 CALayer를 서브클래스 할 필요는 없다. CALayer 인스턴스에 의해 디스플레이 되는 컨텐트들은 다음 방법으로 제공될 수 있다:

  • 코어 그래픽스 이미지 리프리젠테이션으로 직접, 또는 델리게이션을 통해 레이어의 컨텐트 프라퍼티를 설정.
  • 코어 그래픽스 이미지 컨텍스트에 직접 그리는 델리게이트를 제공.
  • 일반적으로 모든 레이어 타입이 가지고 있는 비주얼 스타일 프라퍼티들 중 몇 개를 설정한다. 프라퍼티에는 배경색, 테두리, 그림자, 투명도와 코어 이미지 필터가 있다.
  • CALayer를 서브클래스하고 위 기법들 중 하나 이상을 캡슐화된 방식으로 구현한다.

"Providing Layer Content"는 레이어에 컨텐트를 공급하는 기법들을 설명한다. 비주얼 스타일 프라퍼티와 그것들이 레이어의 컨텐트에 적용되는 순서에 대해서는 "Layer Style Properties"에서 다룬다.

CALayer 클래스뿐만 아니라, 코어 애니메이션 클래스 컬렉션은 어플리케이션이 다른 형태의 컨텐트를 디스플레이 할 수 있도록 부가적인 클래스들을 제공한다.

  • CATextLayer는 스트링이나 속성값을 가진 스트링으로부터 레이어의 컨텐트를 만들어내는 편리한 클래스이다.
  • CAOpenGLLayer는 OpenGL 렌더링 환경을 제공한다. OpenGL을 사용하여 컨텐트를 제공하려한다면 이 클래스를 서브클래스해야 한다. 컨텐트는 정적일 수도 있고 시간에 따라 업데이트 될 수도 있다.
  • CAScrollLayer 클래스는 CALayer의 서브클래스로 레이어의 일부분을 보여주는 일을 쉽게 한다. CAScrollerLayer 오브젝트의 스크롤 가능한 영역을 확장하는 것은 서브레이어들의 레이아웃에 의해 정해진다. CAScrollLayer는 키보드 혹은 마우스 이벤트 핸들링을 제공하지 않을 뿐더러, 시각적인 스크롤러도 제공하지 않는다.
  • CATiledLayer는 크고 복잡한 이미지를 점증적 단계를 거쳐 디스플레이 한다.
  • QCCompositionLayer(쿼츠 컴포저 프레임워크에서 제공)는 쿼츠 컴포저 컴포지션을 컨텐트로 애니메이트 한다.
  • QTMovieLayer와 QTCaptureLayer (퀵타임 프레임워크에서 제공)는 퀵타임 무비와 라이브 비디오를 재생할 수 있도록 한다.


CALayer클래스는 키-밸류 코딩 호환 컨테이너 클래스의 개념을 도입했다. 이는 임의의 값을 키-밸류 코딩 호환 메소드들을 이용해 서브클래스를 만들 필요없이 저장할 수 있는 클래스이다. CALayer는 NSKeyValueCoding 비정형 프로토콜을 확장하여, 기본 키 값과 추가적인 구조체 타입(CGPoint, CGSize, CGRect, CGAffineTransfoem과 CATransform3D)들에 대한 자동 오브젝트 래핑을 지원하며 구조체의 다양한 필드값에는 key path를 이용해 접근할 수 있게 한다.


CALayer는 레이어에 연결된 애니메이션과 액션도 관리한다. 레이어는 레이어 트리에 레이어가 더해지거나 제거될 때, 레이어 프라퍼티에 수정이 가해질때나 사용자가 특별히 요청한 경우에 액션 트리거를 수신한다. 액션들은 일반적으로 애니메이션을 시작하게 한다. 보다 자세한 정보는 "Animation"과 "Actions"를 보라.


[편집] 애니메이션과 타이밍 클래스들

레이어의 많은 시각적인 프라퍼티들은 암시적으로implicitly 애니메이트 가능하다. 애니메이트 가능한 프라퍼티의 값을 변경하기만 하면 레이어는 현재 값에서 새 값으로 애니메이트를 할 것이다. 예를 들어, 레이어를 숨기는 속성을 YES로 바꾸면 레이어가 단계적으로 페이드 어웨이 되는 애니메이션을 발생시킨다. 대부분의 애니메이트 가능한 프라퍼티들은 디폴트 애니메이션과 연계되어 있으며 쉽게 커스터마이즈하거나 대체할 수 있다. 애니메이트 가능한 프라퍼티와 그들의 디폴트 애니메이션에 대한 전체 목록은 "Animatable Properties"에 나열되어 있다.

애니메이트 가능한 프라퍼티들은 명시적으로explicitly도 애니메이트 가능하다. 어떤 프라퍼티를 명시적으로 애니메이트 하려면 코어 애니메이션의 애니메이션 클래스중 하나의 인스턴스를 만들고 필요한 시각적 효과를 지정한다. 명시적 애니메이션은 레이어에서 프라퍼티의 값을 변경하지는 않는다, 단지 디스플레이 상에서 그것을 애니메이트 할 뿐이다.

코어 애니메이션은 레이어 전체의 컨텐트를 애니메이트하거나 베이직 애니메이션이나 키프레임 애니메이션을 이용해서 선택된 어트리뷰트만 애니메이트 하는 애니메이션 클래스들을 제공한다. 코어 애니메이션의 애니메이션 클래스들은 추상클래스인 CAAnimation으로부터 상속된다.CAAnimation은 CAMediaTiming 프로토콜을 적용해 애니메이션의 간단한 총시간, 속도 그리고 반복 횟수를 제공한다. CAAnimation은 또한 CAction 프로토콜을 적용한다. 이 프로토콜은 레이어가 촉발하는 액션 방아쇠에 의해 애니메이션을 시작하는 표준화된 방법을 제공한다.

애니메이션 클래스들은 애니메이션의 진행을 간단한 베지어 곡선으로 설명하는 타이밍 함수도 선언한다. 예를 들어, 직선적인 타이밍 함수는 애니메이션의 진행이 전체 구간동안 동일하다는 것을 의미하며, ease-in 타이밍 함수는 구간의 마지막에와서 애니메이션의 속도가 줄어든다는 것을 의미한다.

코어 애니메이션은 몇 개의 부가적인 추상과 콘크리트 애니메이션 클래스들을 제공한다:

  • CATransition은 전체 레이어의 컨텐트에 영향을 주는 장면전환 효과를 제공한다. 애니메이트 되면 레이어 컨텐트들을 fades, pushed 혹은 reveals 한다. 내장된 장면전환 효과는 코어 이미지 필터를 스스로 만들어서 확장할 수 있다.
  • CAAnimation은 애니메이션 오브젝트들의 어레이가 하나의 그룹으로 만들어지도록 하고 동시에 실행되도록 한다.
  • CAPropertyAnimation은 키 패쓰에 의해 지정되는 레이어 프라퍼티 애니메이팅을 지원하는 CAAnimation의 추상적인 서브클래스이다.
  • CABasicAnimation은 레이어 프라퍼티에 대한 단순한 구간 보정을 제공하는 CAPropertyAnimation의 서브클래스이다.
  • CAKeyframeAnimation은 키 프레임 애니메이션을 지원한다. 레이어 프라퍼티의 키 패쓰가 애니메이트될 것인지를 지정할 수 있고, 애니메이션의 각 단계별 값을 나타내는 값들의 배열과 키 프레임 시간들과 타이밍 함수의 배열을 지정할 수 있다. 애니메이션이 돌아가면, 이제 각각의 값들은 지정된 보간값을 사용해서 설정된다.

이 애니메이션 클래스들은 코어 애니메이션과 코코아 애니메이션 프락시 모두 사용할 수 있다. "Animation"은 코어 애니메이션에 관련된 클래스들을 설명하고, Anitmation Types and Timing Programming Guide는 그 기능들에 대한 보다 깊은 탐구를 포함한다.


[편집] 레이아웃 매니저 클래스들

NSView는 리사이즈될 때 관련된 슈퍼레이어에 대해 고전적인 "기둥과 용수철struts and spring" 위치 조정 모델을 제공한다. 레이어가 이 모델을 지원하고 있지만, 코어 애니메이션은 개발자들이 자신만의 레이아웃 매니저를 작성할 수 있게 유동적인 레이아웃 매커니즘을 제공한다.

코어 애니메이션의 CAConstraint클래스는 당신이 지정하는 컨스트레인트의 세트를 이용해 서브레이어들을 배열하는 레이아웃 매니저이다. 각각의 컨스트레인트(CAconstraints 클래스의 인스턴스에 의해 캡슐화된)는 하나의 레이어의 하나의 위치적인 어트리뷰트(상,하,좌,우 또는 가로 세로 중심)와 그 슈퍼레이어 또는 이웃 레이어의 해당 어트리뷰트와의 관계를 설명한다.

레이아웃 매니저의 일반적인 개념과 컨스트레인트 레이아웃 매니저에 대해서는 "Laying out Core Animation Layers"에서 설명한다.


[편집] 트랜젝션 관리 클래스들

레이어에서 모든 애니메이트 가능한 프라퍼티의 수정은 트랜젝션의 일부분이 된다. CATransaction은 다중의 애니메이션 동작을 디스플레이상의 하나의 아토믹 업데이트로 배칭하는 일을 담당하는 코어 애니메니션 클래스이다. 네스티드Nested 트렌젝션도 지원된다.

코어 애니메이션은 두가지 타입의 트렌젝션을 지원한다 : 암묵적implicit 트렌젝션과 명시적explicit 트랜젝션이다. 암묵적 트렌젝션은 레이어의 애니메이트 가능한 프라퍼티가 활성 트랜스액션 없는 쓰레드에 의해 수정될 때 자동적으로 만들어지며, 쓰레드의 런-루프가 다음번 순회를 할 때 자동적으로 적용된다. 명시적 트렌젝션은 레이어를 수정하기 전에 CATransaction 클래스에 begin 메세지를 보내고 그 후 commit 메세지를 보냄으로서 생성된다.

트랜젝션의 관리는 "Transactions"에서 다룬다.