Questo semplicemente non funziona come funzionano le animazioni UIKit. I sorta-di spiegare come la metà di esso lavora in this answer, ma cercherò di riassumere i bit rilevanti:
- Tutto è un rettangolo strutturato. (Ci sono alcune eccezioni, come forse CAShapeLayer, ma questo è vero per la maggior parte.)
- Le proprietà di
UIView
sono collegate alle proprietà "dell'albero del modello" di CALayer. Cambiano istantaneamente.
- Le animazioni funzionano animando le proprietà "albero di presentazione" dal valore iniziale al valore corrente del modello.
- Il valore iniziale dell'animazione è, per impostazione predefinita, il valore del modello precedente. Specificando
UIViewAnimationOptionBeginFromCurrentState
si utilizza il valore di presentazione corrente.
Ci sono, naturalmente, alcune eccezioni (CAShapeLayer
sembra essere più di un rettangolo strutturato, UIScrollView
fa scorrere animazioni su un timer, transizioni UIView sono un'altra cosa ...).
Come rotazione è suppone a lavorare è che si ottiene un singolo -setFrame:
, tutto sia impostato (e potenzialmente rerendered), e quindi le proprietà animatable sono animati. Per impostazione predefinita, ciò significa che le cose verranno ridistribuite alle nuove dimensioni, ma verranno allungate per adattarle alle vecchie dimensioni, quindi verranno animate (e separate) mentre la rotazione avanza.
Detto questo, GLKView
potrebbe funzionare in modo diverso.Se stai utilizzando GLKViewController
, potrebbe persino sospendere il rendering durante l'animazione di rotazione. Potresti provare a chiamare -setNeedsDisplay
durante la rotazione, ma non sarà di grande aiuto dato che il frame è già impostato sul suo valore finale.
Probabilmente il modo più semplice per gestire autonomamente l'animazione di rotazione è forzare un ritrasmissione non animato al fotogramma ruotato e quindi eseguire alcune modifiche nel renderer (il bordo nero e la barra di stato si animano separatamente).
In alternativa, il modo tradizionale è di creare il tuo VC solo in verticale e gestire le notifiche di orientamento del dispositivo autonomamente, ma questo è un grande contenitore di worm (devi quindi preoccuparti dell'orientamento della barra di stato che determina cose come il tocco offset e orientamento della tastiera, e tende ad interagire "in modo interessante" quando si passa a/da altri VC).
fonte
2013-04-06 02:50:13
Stai usando shader o GLKBaseEffect? –
Provato entrambi: 'GLKBaseEffect' e i miei shader - lo stesso risultato. '-drawRect:' verrà chiamato dopo che l'animazione è stata completata, quindi qualsiasi rendering GL (che normalmente viene posizionato lì) verrà sospeso fino a quel momento. – kpower
Ok. Stavo pensando che forse la proprietà projectionMatrix su GLKBaseEffect era buggata. Ci penserò ... –