# Core Animation

Core Animation è un API per la visualizzazione dei dati, usata sotto il sistema operativo macOS per produrre un'interfaccia utente animata.
Core Animation offre la possibilità agli sviluppatori di produrre interfacce utente animate, sfruttando un modello implicito. Il programmatore specifica solamente lo stato iniziale e finale di un oggetto, mente Core Animation è in grado di calcolarne lo spostamento. Questo permette la creazione relativamente semplice di complicate animazioni, senza richiedere nessun codice specifico. Core Animation può creare un'animazione per qualunque oggetto che sia visibile e fornisce un accesso unificato a Core Image, Core Video e altre tecnologie Quartz. Come altri modelli grafici, Core Animation può sfruttare l'accelerazione con un processore grafico (GPU).

## Storia

Core Animation è apparso pubblicamente per la prima volta con Mac OS X Leopard, ma realmente è emerso dallo sviluppo di iPhone. È stato mostrato in una demo, il 7 agosto 2006 durante l'annuale conferenza WWDC. Al Macworld Expo, Apple ha rivelato che anche iPhone utilizza lo stesso concetto di animazione.

## Funzionamento

Le animazioni vengono eseguite in un thread indipendente dal programma, consentendo così l'esecuzione di processi simultanea a Core Animation. In questo modo le prestazioni dell'applicazione non vengono diminuite ed è possibile controllare, interrompere, invertire e ricostruire le animazioni stesse.

## Esempi

Uno degli esempi più evidenti di Core Animation, è iChat, l'istant messenger di Apple, ora sostituito con iMessage. Le animazioni vengono utilizzate per aggiungere gli amici che hanno effettuato l'accesso nella tua lista contatti.
Ancora un altro esempio è l'interfaccia dell'iPhone, dispositivo che monta una versione modificata di macOS, che sfrutta appunto Core Animation.

## Temi
### Nozioni di base sui livelli

class CALayer
Un oggetto che gestisce il contenuto basato su immagini e consente di eseguire animazioni su quel contenuto.
protocol CALayerDelegate
Metodi che un'app può implementare per rispondere agli eventi relativi al livello.
class CAConstraint
Una rappresentazione di un singolo vincolo di layout tra due livelli.
protocol CALayoutManager
Metodi che consentono a un oggetto di gestire il layout di un layer e dei suoi sottolivelli.
class CAConstraintLayoutManager
Un oggetto che fornisce un gestore di layout basato su vincoli.
protocol CAAction
Un'interfaccia che consente agli oggetti di rispondere alle azioni innescate da una CALayermodifica.

### Testo, forme e sfumature

class CATextLayer
Un livello che fornisce un layout di testo semplice e il rendering di stringhe normali o attribuite.
class CAShapeLayer
Un livello che disegna una spline Bézier cubica nel suo spazio di coordinate.
class CAGradientLayer
Un livello che disegna una sfumatura di colore sul colore di sfondo, riempiendo la forma del livello (compresi gli angoli arrotondati)

### Animazione

class CAAnimation
La superclasse astratta per le animazioni in Core Animation.
protocol CAAnimationDelegate
Metodi che l'app può implementare per rispondere all'avvio e all'arresto delle animazioni.
class CAPropertyAnimation
Una sottoclasse astratta di CAAnimationper la creazione di animazioni che manipolano il valore delle proprietà del livello.
class CABasicAnimation
Un oggetto che fornisce funzionalità di animazione di base con fotogramma chiave singolo per una proprietà del livello.
class CAKeyframeAnimation
Un oggetto che fornisce funzionalità di animazione dei fotogrammi chiave per un oggetto livello.
class CASpringAnimation
Un'animazione che applica una forza simile a una molla alle proprietà di un livello.
class CATransition
Un oggetto che fornisce una transizione animata tra gli stati di un livello.
class CAValueFunction
Un oggetto che fornisce un metodo flessibile per definire le trasformazioni animate.

### Gruppi di animazione

class CAAnimationGroup
Un oggetto che consente di raggruppare ed eseguire più animazioni contemporaneamente.
class CATransaction
Un meccanismo per raggruppare più operazioni dell'albero dei livelli in aggiornamenti atomici dell'albero di rendering.

### Tempistica dell'animazione

func CACurrentMediaTime -> CFTimeInterval
Restituisce il tempo assoluto corrente, in secondi.
class CAMediaTimingFunction
Una funzione che definisce il ritmo di un'animazione come una curva di temporizzazione.
protocol CAMediaTiming
Metodi che modellano un sistema di temporizzazione gerarchico, consentendo agli oggetti di mappare il tempo tra l'ora principale e l'ora locale.
class CADisplayLink
Un oggetto timer che consente all'applicazione di sincronizzare il proprio disegno con la frequenza di aggiornamento del display.

### Sistemi di particelle

class CAEmitterLayer
Un livello che emette, anima e rende un sistema di particelle.
class CAEmitterCell
La definizione di una particella emessa da un CAEmitterLayer.

### Opzioni avanzate dei livelli

class CAScrollLayer
Un livello che visualizza contenuti scorrevoli più grandi dei propri limiti.
class CATiledLayer
Un livello che fornisce un modo per fornire in modo asincrono porzioni del contenuto del livello, potenzialmente memorizzato nella cache a più livelli di dettaglio.
class CATransformLayer
Oggetti utilizzati per creare vere gerarchie di livelli 3D, piuttosto che il modello di rendering della gerarchia appiattito utilizzato da altre classi CALayer.
class CAReplicatorLayer
Un livello che crea un numero specificato di copie del sottolivello con trasformazioni geometriche, temporali e di colore variabili.

### Metal e OpenGL

class CAMetalLayer
Un livello di animazione principale in cui Metal può eseguire il rendering, in genere da visualizzare sullo schermo.
protocol CAMetalDrawable
Un oggetto MetalDrawable associato a un livello Core Animation.
class CAEDRMetadata
Metadati che descrivono come i valori della gamma dinamica estesa (EDR) devono essere mappati sui toni.
class CARenderer
Un livello che consente a un'applicazione di eseguire il rendering di un albero dei livelli in un contesto OpenGL principale.

### Visualizzazione remota del contenuto dei livelli

class CARemoteLayerClient
class CARemoteLayerServer

### Trasforma

Transforms
Definisce le matrici di trasformazione per applicare trasformazioni affini ai livelli in Core Animation.