Po prostu nie działa to, jak działają animacje UIKit. I sort-of wyjaśnić, jak połowa z nich pracuje w this answer, ale postaram się podsumować odpowiednie bity:
- Wszystko jest teksturą prostokąta. (Istnieje kilka wyjątków, jak na przykład CAShapeLayer, ale jest to w większości przypadków prawdziwe.) Właściwości
UIView
są powiązane z właściwościami "drzewa modelu" CALayera. Zmieniają one natychmiastowo.
- Animacje działają poprzez animowanie właściwości drzewa prezentacji od wartości początkowej do bieżącej wartości modelu.
- Początkową wartością animacji jest domyślnie poprzednia wartość modelu. Podanie
UIViewAnimationOptionBeginFromCurrentState
powoduje, że używa on bieżącej wartości prezentacji.
Istnieje oczywiście kilka wyjątków (CAShapeLayer
wydaje się być bardziej niż teksturą rect, UIScrollView
powoduje przewijanie animacji na zegar, przejścia UIView to zupełnie inna sprawa ...).
Jak rotacja jest powinien do pracy jest to, że można dostać jeden -setFrame:
, wszystko jest rozplanowane (i potencjalnie rerendered), a następnie właściwości animatable są animowane. Domyślnie oznacza to, że rzeczy będą poddawane nowym wymiarom, ale rozciągnięte, aby pasowały do starych wymiarów, a następnie animowane (i rozprężane) w miarę postępu rotacji.
To powiedziawszy, GLKView
może działać inaczej.Jeśli używasz GLKViewController
, może nawet zawiesić rendering podczas animacji rotacji. Możesz spróbować wywołać -setNeedsDisplay
podczas rotacji, ale to niewiele pomoże, ponieważ ramka jest już ustawiona na jej wartość końcową.
Najprawdopodobniej najłatwiejszym sposobem radzenia sobie z animacją rotacji jest zmuszenie nie-animowanego przekaźnika do obróconej ramki, a następnie wykonanie fragmentacji w rendererze (jednak czarna ramka i pasek stanu są osobno animowane).
Alternatywnie, tradycyjny sposób polega na tym, aby uzyskać tylko portret VC i obsługiwać powiadomienia o orientacji urządzenia samemu, ale jest to duża puszka robaków (musisz wtedy martwić się o orientację paska stanu, która określa rzeczy takie jak dotyk przesunięcie i orientacja klawiatury, i ma tendencję do interakcji "interesująco" podczas przechodzenia do/z innych VC).
Czy używasz cieniowania lub GLKBaseEffect? –
Próbowałem zarówno: "GLKBaseEffect", jak i własnych shaderów - ten sam wynik. '-drawRect:' zostanie wywołany po zakończeniu animacji - więc wszelkie renderowanie GL (które zwykle tam umieszczamy) zostanie zawieszone do tego momentu. – kpower
Ok. Myślałem, że może właściwość projectionMatrix na GLKBaseEffect była błędna. Pomyślę ... –