Bu, UIKit animasyonlarının nasıl çalıştığı değil. bunun yarısı this answer nasıl işlediğini ben sıralama-açıklamak ama ilgili bitleri özetlemeye çalışacağım:
- Her şey dokulu dikdörtgendir. (Belki de CAShapeLayer gibi bazı istisnalar vardır, ancak bu çoğu zaman için geçerlidir.)
UIView
'un özellikleri CALayer'in "model ağacı" özelliklerine bağlıdır. 'u anında değiştirir.
- Animasyonlar, "sunum ağacı" özelliklerini başlangıç değerinden geçerli model değerine göre hareket ettirerek çalışır.
- Animasyonun başlangıç değeri, varsayılan olarak önceki model değeridir.
UIViewAnimationOptionBeginFromCurrentState
belirtmek, geçerli sunum değerini kullanır.
vardır, tabii ki, birkaç istisna (CAShapeLayer
, UIView geçişler ... tamamen başka bir şey vardır UIScrollView
uyandırmasına animasyonlar kaydırma yok, dokulu rect'in daha görünüyor).
rotasyon sözde Nasıl çalışmak tek -setFrame:
, her şey ortaya koydu (ve potansiyel olarak yeniden oluşturulur) olduğu almak, sonra da canlandırılabilir özellikleri animasyonlu olmasıdır. Varsayılan olarak, bu durum şeylerin yeni boyutlara yeniden işleneceği, ancak eski boyutlara sığacak şekilde uzatılacağı ve daha sonra döndürme ilerledikçe harekete geçirildiği (ve geri çekildiği) olduğu anlamına gelir.
Bu, GLKView
farklı şekilde çalışabilir.GLKViewController
kullanıyorsanız, döndürme animasyonu sırasında oluşturmayı bile askıya alabilir. Döndürme sırasında -setNeedsDisplay
numaralı telefonu aramayı deneyebilirsiniz, ancak çerçeve zaten son değerine ayarlandığından çok yardımcı olmaz.
Muhtemelen döndürme animasyonuyla başa çıkmanın en kolay yolu, animasyonlu olmayan bir geçişi döndürülmüş çerçeveye zorlamak ve daha sonra rendererde biraz dalgalanma yapmaktır (siyah kenarlık ve durum çubuğu ayrı ayrı olsa da).
Alternatif olarak, geleneksel yöntem VC'nizi yalnızca portre yapmak ve aygıt yönlendirme bildirimlerini kendiniz yapmaktır, ancak bu büyük bir solucan olabilir (daha sonra dokunma gibi şeyleri belirleyen durum çubuğu yönlendirmesi hakkında endişelenmeniz gerekir) ofset ve klavyeli yönlendirme ve diğer VC'lere geçiş yaparken "ilginç şekilde" etkileşime girme eğilimindedir.
Gölgeler veya GLKBaseEffect kullanıyor musunuz? –
Her ikisinde de çalıştı: "GLKBaseEffect" ve kendi gölgelendiricilerim - aynı sonuç. '-drawRect:' animasyon bittikten sonra çağrılacak - bu yüzden herhangi bir GL renderleme (normalde oradayız) o an için askıya alınacaktır. – kpower
Tamam. GLKBaseEffect'teki projectionMatrix özelliğinin buggy olduğunu düşünüyordum. Bir düşüncem var ... oryantasyon değiştikten sonra –