2009-02-05 20 views
16

Basit kodu (pseudocode) gibi bir şey gider, böylece onun merkezi etrafında bazı UIView döndürmek çalışıyorum döndürmek M_PI/2 demek, şey güzelce döner. 2 * M_PI olarak ayarlıyorum, iyi "yok" yapar. Matrisin hiçbir şey yapmayan bir şeye dönüştüğünü anlayabiliyorum (360 dönen "bir anlamda" kal "anlamına geliyor), , yine de 5 kez döndürmek istiyorum. tarif etmede büyük değil, birinin anlayacağını umuyorum). Yani, 180 derece (M_PI) ayar açısını eklemeye ve iç içe bir animatationBlock eklemeye çalıştım. ama sanırım aynı özelliği (someview.transition) tekrar belirlediğimden, bir şekilde onu görmezden geliyor). Animasyonun tekrar sayısını M_PI açısıyla 2 olarak ayarlamayı denedim ancak 180 değerini döndürdüğümde düz konuma geri dönüp ardından döndürmeyi tekrar başlatıyor gibi görünüyor.bir kendi merkezi etrafında UIView ama birkaç kez

Bu yüzden, biraz fikrim yok, herhangi bir yardım takdir! --t

+0

da burada başlayabilirsiniz: https://github.com/jonasschnelli/UIView-i7Rotate360 çok kolay uygulanması ve değişim için. –

+0

[UIView Infinite 360 ​​derece döndürme animasyonu olası kopyası?] (Http://stackoverflow.com/questions/9844925/uiview-infinite-360-degree-rotation-animation) –

cevap

36

UIView katman katmanınızda aşağıdaki animasyonu kullanabilirsiniz. Bunu test ettim. Sürekli eğirme efekti alma

UIView *viewToSpin = ...;  
CABasicAnimation* spinAnimation = [CABasicAnimation 
            animationWithKeyPath:@"transform.rotation"]; 
spinAnimation.toValue = [NSNumber numberWithFloat:5*2*M_PI]; 
[viewToSpin.layer addAnimation:spinAnimation forKey:@"spinAnimation"]; 
+0

Bu animasyonu nasıl yavaşlatabilirim? – mahboudz

+0

Animasyon zamanlamasıyla ilgili düşünceler için, lütfen CABasicAnimation'ın uyguladığı CAMediaTiming Protocol için referans malzemeye bakın. Özellikle, muhtemelen 'süre' özelliğini ayarlamak istersiniz. Yukarıdaki kod, 0.25 saniye varsayılan süresini kullanıyor. –

1

biraz zor olduğunu, ama bunu here yapmak için bir yol tarif eder. Evet, Çekirdek Animasyon, dönüşümleri birim çemberindeki en yakın bitiş konumuna kadar optimize ediyor gibi görünüyor. Orada tarif ettiğim yöntem, bir rotasyondan diğerine geçerken hafif bir parçalanma farketmesine rağmen, tam rotasyon yapmak için birkaç yarım rotasyonlu animasyonu zincirler.

Belki de bu yarı dönüş değerleri ile oluşturulan bir CAKeyframeAnimation, gitmek için doğru yol olabilir. Sonra da hızlanmayı ve yavaşlamayı kontrol edebilirsiniz.

6

Brad Larson'ın belirttiği gibi, bunu CAKeyframeAnimation ile yapabilirsiniz. Örneğin,

CAKeyframeAnimation *rotationAnimation; 
rotationAnimation = 
    [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 

rotationAnimation.values = [NSArray arrayWithObjects: 
          [NSNumber numberWithFloat:0.0 * M_PI], 
          [NSNumber numberWithFloat:0.75 * M_PI], 
          [NSNumber numberWithFloat:1.5 * M_PI], 
          [NSNumber numberWithFloat:2.0 * M_PI], nil]; 
rotationAnimation.calculationMode = kCAAnimationPaced; 
rotationAnimation.removedOnCompletion = NO; 
rotationAnimation.fillMode = kCAFillModeForwards; 
rotationAnimation.timingFunction = 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
rotationAnimation.duration = 10.0; 

CALayer *layer = [viewToSpin layer]; 
[layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

için rotationAnimation.timingFunction özelliği ile rotationAnimation.duration özelliği toplam animasyon süresini ve (arasındaki aşamaların ve hesaplama) hızlanma ve yavaşlama kontrol edebilir.

1
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.fromValue = [NSNumber numberWithFloat:0.0f]; 
animation.toValue = [NSNumber numberWithFloat: 2*M_PI]; 
animation.duration = 8.0f; 
animation.repeatCount = INFINITY; 
[self.myView.layer addAnimation:animation forKey:@"SpinAnimation"];