Core Animation Programming Guide

Core Animation Basics

Core Animation은 앱의 뷰를 대체하는 것이 아니라 뷰들과 결합하여 더 좋은 성능을 발휘하면서 그들의 컨텐츠를 애니메이팅하는 데 도와주는 기술이다. 이것은 뷰들의 컨텐츠를 비트맵으로 캐싱함으로써 그래픽 하드웨어가 직접적으로 조작할 수 있게함으로써 달성된다.

주로 뷰의 위치, 크기, 투명도 등의 특성의 변화를 애니메이션으로 주고싶을 때 사용하는 데, 그러한 변화를 일으키면 코어 애니메이션이 시작값과 끝점 사이에서 애니메이션을 만들어낸다.

Layers Provide the Basis for Drawing and Animations

Layer 객체는 3D 공간 안에 존재하는 2D 평면으로써 코어 애니메이션을 사용하는 데에 핵심이 된다. 뷰와 같이 레이어도 기하학적, 컨텐츠, 비주얼 정보를 관리하지만, 다른 점은 그들 자신의 외양을 정하지 않는다는 것이다. 레이어는 단지 비트맵을 둘러싼 상태 정보만을 관리한다. 비트맵은 그 자체로 또는 고정된 이미지로 그려진 결과이다. 앱에서 관리하는 메인 레이어는 주로 데이터를 관리하기 때문에 모델 객체로 여겨진다. 이 개념은 애니메이션의 행동에 영향을 미치기 때문에 중요하다.

The Layer-Based Drawing Model

대부분의 레이어는 앱에 직접 그리지 않는다. 대신, 레어어는 앱이 제공하는 컨텐츠를 캡쳐하고 그것을 backing store라고 불리는 비트맵에 캐싱한다. 레이어의 프로퍼티를 바꾸는 것은 레이어와 관련된 상태 정보를 바꾸는 것이고, 이 변화는 애니메이션을 일으킨다. 코어 애니메이션은 레이어의 비트맵과 상태 정보를 그래픽 하드웨어에 전달하고 그래픽 하드웨어는 비트맵 정보를 조작함으로써 소프트웨어로 그리는 것보다 훨씬 더 빠르게 렌더링 작업을 한다.

정적인 비트맵을 조작하기 때문에 레이어 기반의 드로잉 작업은 전통적인 뷰 기반 드로잉 기술과 많이 다르다. 뷰의 변화점을 다시 그리려면 drawRect: 메서드에 새로운 파라미터를 전달해 그리는데, 이 작업은 CPU의 메인 스레드에서 돌기 때문에 비용이 크다. 코어 애니메이션은 하드웨어가 캐싱된 비트맵을 조작하게 함으로서 이 비용을 피한다.

코어 애니메이션이 캐쉬화된 컨텐츠를 사용하기는 하지만, 시간에 따라 적절한 초기 컨텐츠를 제공해야만 한다. 그 방법은 Providing a Layer’s Contents에서 설명한다.

Layer-Based Animations

레이어 객체의 데이터와 상태 정보는 레이어의 컨텐츠의 시각적 표현과 분리된다. 이러한 분리는 코어 애니메이션이 이전 상태값과 새로운 상태값 사이에서 애니메이션을 넣고 중재할 수 있게 한다. 레이어의 적절한 프로퍼티를 조정함으로써 코어 애니메이션은 그 프로퍼티에 맞는 적절한 애니메이션을 제공한다.

애니메이션 도중 코어 애니메이션은 하드웨어에서의 프레임마다의 드로잉을 한다. 당신은 그저 시작점과 끝점만 코어 애니메이션에게 제공하고 나머지는 맡기면 된다. 물론 타이밍 정보나 필요한 파라미터를 전달할 수도 있지만 하지 않아도 코어 애니메이션이 적절한 값을 제공한다.

Layer Objects Define Their Own Geometry

레이어의 중요한 일 중 하나는 컨텐츠의 기하학적 정보를 관리하는 것이다. 기하학적 정보는 컨텐츠의 bounds, position, rotated, scaled, tranformed 등의 정보를 포함한다. 레이어도 뷰와 마찬가지로 레이어와 컨텐츠를 위치할 수 있는 frame과 bounds 사각형의 정보를 가지고 있다. 레이어는 뷰가 가지고 있지 않은 정보를 담고도 있는데, 예를 들면 anchor point 가 있는데 이 지점을 중심으로 조작이 일어난다. 레이어의 기하학 정보를 수정하는 것은 뷰의 정보를 특정하는 것과 다르다.

Layers Use Two Types of Coordinate Systems

레이어는 컨텐츠의 위치를 잡을 때 point-based coordinate 시스템과 unit coordinate 시스템 둘 다를 사용한다. 어떤 좌표 시스템을 사용할 지는 어떤 타입의 정보를 전달하느냐에 따라 달라진다. Point 기반 좌표는 화면 좌표계에 바로 대응되거나 다른 레이어에 상대적으로 특정되는 값을 전달할 때 사용하는데, 대표적으로 position 프로퍼티가 있다. Unit 좌표는 그 값이 화면 좌표에 묶이면 안 되고 다른 값에 상대적일 때 사용되며 대표적으로 레이어의 bounds에 상대적으로 특정되는 point인 anchorPoint 프로퍼티가 있다.

… continue

Reference