La classe UIView espone un puntatore al layer (CALayer), un oggetto di più basso livello con innumerevoli potenzialità. Il layer mette a disposizione tutta una serie di metodi e proprietà legati alla visualizzazione del contenuto della view. Ad esempio è possibile manipolare il contenuto di una view nello spazio tridimensionale. Nell’esempio che riporto è interessante notare che il codice è semplice, e il tutto è realizzato sfruttando Interface Builder:

Nella prova che ho fatto ho inserito un controllo UIImageView all’interno di un view contenitore. Questo per dimostrare che tutti gli oggetti (le viste) vengono alterate se si agisce sul contenitore padre.

Nell’esempio sorgente allegato illustro due procedimenti diversi per effettuare la rotazione sui tre assi. Il primo fa uso delle trasformazioni:
1 2 3 4 5 | CATransform3D trans = CATransform3DIdentity; trans = CATransform3DRotate(trans, DegreesToRadians([sliderX value]), 1, 0, 0); trans = CATransform3DRotate(trans, DegreesToRadians([sliderY value]), 0, 1, 0); trans = CATransform3DRotate(trans, DegreesToRadians([sliderZ value]), 0, 0, 1); [viewContainer.layer setTransform:trans]; |
il secondo accede direttamente alle proprietà della trasformata:
1 2 3 4 | CALayer *myLayer = viewContainer.layer; [myLayer setValue:[NSNumber numberWithDouble:DegreesToRadians([sliderX value])] forKeyPath:@"transform.rotation.x"]; [myLayer setValue:[NSNumber numberWithDouble:DegreesToRadians([sliderY value])] forKeyPath:@"transform.rotation.y"]; [myLayer setValue:[NSNumber numberWithDouble:DegreesToRadians([sliderZ value])] forKeyPath:@"transform.rotation.z"]; |
Il risultato è – ovviamente – esattamente lo stesso!
Alcune note
All’interno del codice troverete nel file RotateLayerViewController.m una costante USE_CATRANSFORM impostata ad 1. Questa serve per usare un metodo di rotazione invece che l’altro:
1 | #define USE_CATRANSFORM 1 |
Impostandola a 0, cambierete metodo.
Sempre all’interno del codice di RotateLayerViewController.m, c’è una parte da decommentare nel caso volete modificare il punto di ancoraggio (anchorPoint) rispetto al quale effettuare le rotazioni:
1 2 | // Decommentare la linea qui sotto per modificare il punto di ancoraggio // myLayer.anchorPoint = CGPointMake(0.1f, 0.8f); |
Infine, la funzione DegreesToRadians() permette di convertire da gradi a radianti, ed è definita nel file RotateLayerViewController.m. Anche se io preferisco usare le define:
1 2 3 4 5 6 7 8 9 10 11 12 13 | /*! @defined degreesToRadians @abstract Converte da gradi a radianti @discussion Converte da gradi a radianti */ #define degreesToRadians(x) (M_PI * x / 180.0) /*! @defined radiandsToDegrees @abstract Converte da radianti a gradi @discussion Converte da radianti a gradi */ #define radiandsToDegrees(x) (x * 180.0 / M_PI) |
Per il sorgente esempio clicca qui.








4
Non ci sono commenti per questo Post
Lascia un commento