2009-02-12 23 views
28

Bir iPhone uygulaması yazıyorum ve dışardan girmeyi sevdiğim bir resmim var. Bir görünümü 360 derece döndürmek için CGAffineTransformMakeRotation kullanabilir miyim?

anda benim kodu (/ commitAnimations bloğu beginAnimations sarılı) şöyle görünür:

scale = CGAffineTransformScale(CGAffineTransformIdentity, 5.0f, 5.0f); 
swirl = CGAffineTransformRotate(scale, M_PI); 
[player setTransform:swirl];  
[player setAlpha:0.0f]; 

Ama bulmak ben, 4 * M_PI diyelim ki, dönüş açısını değiştirmeye çalışırsanız, o hiç dönmüyor. CGAffineTransformRotate kullanılarak 720˚'lik bir dönüş elde etmek mümkün mü yoksa başka bir teknolojiye geçmek zorunda mıyım?

başka teknolojiye geçmek için varsa

, sen kendim animasyon yapmak için başka bir iş parçacığı (veya bir zamanlayıcı) kullanarak öneriyoruz veya daha iyi bir rota gitmek olacak OpenGL ki?

sayesinde
Blake.

cevap

64

Bir dönüşü, dönüşü parçalara ayırmak zorunda kalmadan tam bir dönüşten veya tam dönüşün birçok katından farklı olup olmadığına bakmadan, bir miktar radyan tarafından döndürebilirsiniz. Örnek olarak, aşağıdaki kod belirli bir saniye boyunca bir saniyede bir görüntüyü döndürür. Bir görünümü belirli sayıda rotasyonla veya birtakım radyanlarla döndürmek için kolayca değiştirebilirsiniz.

+0

Bu çalışır. Diğer insanların gönderilerini yorumlarken bunu yayınladığınız için ve teşekkürler! Animamı bölmek üzereydim! – Dimitris

+0

Onları da bölüşürdüm ve bu doğru görünmüyordu. – mahboudz

+0

transform.rotation.z için bunu yaptığınızdan emin olun. Sadece CATransform3DMakeRotation ile dönüştürmeyi denerken sorunlarım vardı. Make rotasyon işlevini kullandığımda "gimbal lock" içine koşmaya devam ettim. Yukarıda belirtildiği gibi transform.rotation.z kullandığımda güzel çalışır! – Jay

5

Yapabilirsin, ancak yarım daire rotasyonlar halinde animasyon bölmek gerekecektir. Görünümün altındaki katmana uygulanan yinelenen bir CABasicAnimation kullanarak, buna this question cevabında bir örnek veriyorum. Ben animasyon yumuşak olurdu çünkü CAKeyframeAnimation parçaları muhtemelen bu yapı daha iyi bir yol olacağı gibi bu yarım rotasyonlar yaparak, orada önermek gibi (benim örnekte yarım rotasyonlar arasında hafif bir aksaklık var) ve yapabileceğin Başlangıçta ve sonunda güzel bir hızlanma/yavaşlama. başlığa

+0

Serin. Bu, umduğum şeyi yapıyor gibi görünüyor ve bunun için de bir ölçekleme dönüşümü ekleyebileceğimi ve sınıfıma kendi başıma bir bildirim alabileceğimi düşünüyorum. Teşekkürler! – bwinton

+2

Bir animasyonu yarım daire dönüşlerine bölmeniz gerektiğini söylemek yanlıştır. Cevabımı gör. – mahboudz

+0

Animasyon yaptığınız değer olarak CATransform3D'ye güveniyorsanız. Kendi yaklaşımınızı düşünmemiştim, Core Animation'ın dönüşüm yapısı alanları için sağladığı ana yol uzantılarını kullanıyordum. Haklısın, muhtemelen buna yaklaşmanın daha temiz bir yolu. –

5

Cevap: Evet, CGAffineTransform gayet fazla 360 derece dönebilir. sorusuna
Cevap: animasyon bir şey yok çünkü Evet, ama bunu can veremezler.

Bu bir the affine transformation is a matrix unutmayın ve bir döndürme matrisi, önceden hesaplanmış sinüs ve kosinüs sayıları içerir. Dediğin sanki:

Şimdi
CGFloat angle = 4.0 * M_PI; 
NSAffineTransformStruct matrix = { 
    .m11 = cos(angle), 
    .m12 = sin(angle), 
    .m21 = -sin(angle), 
    .m22 = cos(angle), 
    .tx = 0.0, 
    .ty = 0.0 
}; 
NSAffineTransform *transform = [NSAffineTransform transform]; 
[transform setTransformStruct:matrix]; 

, en cos ve sin için bazı örnek değerler gözden geçirelim:

  • cos(0π) = 1
  • sin(0π) = 0
  • cos(2π) = 1
  • sin(2π) = 0
  • Matris açısı içermeyen = 0

Ol= 1

  • sin(4π), - sadece kosinüs ve sinüs içerir. Ve bu değerler bir dairenin bir katından diğerine değişmez. Bu nedenle, animasyon için hiçbir şey yoktur.

    (Calculator.app cos (xπ) ve sin (xπ) için yanlış sonuçlar verir unutmayın. Grapher, calc veya Google deneyin.)

    Bir çevredeki kesirleri içine animasyonu bölmek gerekir. Brad Larson'un önerdiği yarım daireler çok iyi olacak.

  • +2

    Animasyonu bölmeniz gerekmez. Cevabımı gör. – mahboudz

    İlgili konular