2010-08-12 20 views
8

Animuję wahadło, które zmienia się z 0 stopni na maksimum 200 stopni, a następnie z powrotem. Problem polega na tym, że jeśli wahadło przekroczy 180 stopni, powraca do 0 najkrótszą drogą, która ma iść w prawo. I chciałbym, żeby poszło w kierunku przeciwnym do ruchu wskazówek zegara. Oto mój kod: („prawo” jest wartością logiczną, co jest prawdą, gdy wahadło kołysze się od lewej do prawej)Wymuś obrót w kierunku zgodnym lub przeciwnym do ruchu wskazówek zegara, aby wywołać CABasicAnimation z UIImageView

- (void)swingPendulum { 
    CABasicAnimation *rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    if (right) 
     rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMax)]; 
    else 
     rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)];        
    rotationAnimation.duration = 1.0; 
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.delegate = self; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
    rotationAnimation.removedOnCompletion = NO; 

    [pendulum.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
} 

jakieś pomysły w jaki sposób można dokonać tej pracy? To ostatni kawałek mojej swingometru, który poza tym działa świetnie: D!

Michael

Odpowiedz

8

Aby dostać to, aby przejść w lewo, po prostu ustawić x do wartości ujemnej (dodać - w przód) gdzie chcesz

rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(x)]; 
+0

Dziękuję za odpowiedź, ale nie wydaje mi się to ważne. Obawiam się. Ustawienie go na wartość -ive sprawia, że ​​animacja jest na końcu ...Myślę, że być może będę musiał napisać go ponownie, aby użyć NSTimer'a i animować obiekt klatka po klatce ... – Smikey

+0

Właściwie masz rację - ponieważ kMin jest obecnie ustawiony na -20, więc robi to huśtawka przeciwnie do ruchu wskazówek zegara, ale tylko wtedy, gdy nie przekracza 180 stopni. Jeśli minie 180, to bez względu na to, jaką ustawię wartość (-180, -90, 90 itd.), Zawsze kontynuuje zgodnie z ruchem wskazówek zegara, nawet jeśli nie jest to najkrótsza droga ... Jakieś inne pomysły? – Smikey

+1

AAAAH, jeśli ustawię wartość podobną do -380, działa. Nie jestem do końca pewien, dlaczego, ale właśnie dodałem warunek, który przełącza wartość ToValue w zależności od tego, czy początkowa zmiana przekroczyła 180 stopni. Dzięki za pomoc! – Smikey

0

Nie jestem pewien, co dokładnie jest problem, ale jeśli używasz funkcji odwrotnej auto animacji, można to prawdopodobnie uprościć i spowodować, że do obracania (huśtawka) iz powrotem. Działa to dla mnie:

CABasicAnimation* rotationAnimation = 
      [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
[rotationAnimation setToValue:[NSNumber numberWithFloat:DegreesToRadians(200.0)]]; 
[rotationAnimation setDuration:1.0]; 
[rotationAnimation setRepeatCount:HUGE_VALF]; // Repeat forever 
[rotationAnimation setAutoreverses:YES]; // Return to starting point 

[[pendulum layer] addAnimation:rotationAnimation forKey:nil]; 
+0

Dobry pomysł, ale odwrotna huśtawka nie jest dokładnym odwróceniem huśtawki do przodu. To znaczy. wychylenie do przodu rozpoczyna się od 0, ale odwrotne wahanie zmienia się z powrotem na -20. Tak więc wolałbym nazwać funkcję, która zmienia ją z aktualnej transformacji na konkretny kąt. Nie próbuję dokładnie zrobić wahadła, a raczej swingometr w stylu gry golfowej - gracz zatrzymuje go raz na drodze, by uzyskać moc i ponownie w drodze w dół, aby uzyskać dokładność. Działa to doskonale, chyba że pasek przechodzi ponad 180 stopni w górę, po czym będzie się obracał w kierunku przeciwnym do ruchu wskazówek zegara do 0, zamiast odwracać. Więc muszę wymusić, że jest w jakiś sposób – Smikey

1

spróbuj ustawić coś

rotationAnimation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ]; 

Korzystanie wartość transformaty funkcji, animacje mogą wpływać na właściwości transform warstwą przy użyciu dowolnych przekształceń poszczególnych składników (bez normalizacji do 360 °) i łączą się w sposób normalny, gdy jednocześnie stosuje się wiele animacji.

Używa się funkcji przekształcenia wartości, która obraca się od 0 ° do 180 ° wokół osi Z, tworząc funkcję CAValueTransform, określając kCAValueFunctionRotateZ, a następnie tworząc animację o wartości fromValue do wartości M_PI i ustawiając wartość Wartość właściwości animationTransform do instancji przekształcenia wartości.

+0

Dzięki. Jestem trochę niechętny do zmiany podejścia, które już używam, chyba że nie ma sposobu, aby to naprawić, ponieważ mam dużo innych kodów, które opierają się na metodach, których już używałem. Jak wspomniano powyżej, faktycznie tworzę swingometr typu golf-game, a nie wahadło, więc w dowolnym momencie użytkownik może przerwać huśtawkę w trakcie jazdy w górę (w celu określenia mocy), a następnie cofnie się, aby użytkownik mógł przerwać ponownie (w celu ustalenia dokładności). Mam tę całą funkcjonalność, oprócz tego, że jeśli użytkownik pozwala na obrót o 180 stopni, nie odchyla się, a raczej idzie do przodu. – Smikey

+0

Spróbuj ustawić i sprawdzić, czy działa? Mam wrażenie, że powinno. –

+0

Zrobiłem - zaczęło się zachowywać dziwnie ... Będę miał trochę więcej skrzypiec i wrócę! – Smikey

1

Myślę, że trzeba użyć tego kodu:

[rotationAnimation.byValue = [NSNumber numberWithFloat:degreesToRadians(kMax/2))]; 
[rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)]; 
Powiązane problemy