Live rotation eines Bildes auf Zeit

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Live rotation eines Bildes auf Zeit

    Hallo,

    ich bin dabei meine erste größere App zu Programmieren habe folgendes Problem:

    Ich möchte, dass sich ein Bild bei Knopfdruck (konstant) dreht. Und zwar in 8 Minuten um 360°.

    Folgenden Code habe ich für den Button geschrieben:


    Quellcode

    1. - (IBAction)startPressed:(id)sender
    2. {
    3. double angleMinute = 0.75*M_PI/180;
    4. int Zeit=0;
    5. double drehung=0;
    6. while (Zeit<60*8 ) {
    7. CGAffineTransform rotationMinutenZeiger = CGAffineTransformMakeRotation(angleMinute);
    8. self.minutenZeiger.transform = rotationMinutenZeiger;
    9. drehung=drehung+angleMinute;
    10. sleep(1);
    11. Zeit++;
    12. NSLog(@"angleMinute = %f, Zeit = %d, Drehung = %f",angleMinute, Zeit, drehung);
    13. }}
    Alles anzeigen


    Der Log sieht dann so aus:

    2013-04-26 12:09:45.464 8minutenuhr[2008:11303] angleMinute = 0.013090, Zeit = 1, Drehung = 0.013090
    2013-04-26 12:09:45.465 8minutenuhr[2008:11303] angleMinute = 0.013090, Zeit = 2, Drehung = 0.026180
    2013-04-26 12:09:45.466 8minutenuhr[2008:11303] angleMinute = 0.013090, Zeit = 3, Drehung = 0.039270

    ...

    2013-04-26 12:09:45.857 8minutenuhr[2008:11303] angleMinute = 0.013090, Zeit = 478, Drehung = 6.257005
    2013-04-26 12:09:45.857 8minutenuhr[2008:11303] angleMinute = 0.013090, Zeit = 479, Drehung = 6.270095
    2013-04-26 12:09:45.875 8minutenuhr[2008:11303] angleMinute = 0.013090, Zeit = 480, Drehung = 6.283185

    also an sich funktioniert die Schleife. Aber es findet keine kontinuierliche Drehung statt. Die Schleife läuft zu ende und erst dann werden die Drehungen durchgeführt. Wie kann ich erreichen, dass nach jedem Schleifenschritt das Bild um eben die angleMinute gedreht wird?

    greetings

    PS: kann man irgendwie einstellen, dass ich beim Code posten nicht 100 Smilies im Code habe? =) €: Hat sich erledigt :P
  • frechdaggs schrieb:

    also an sich funktioniert die Schleife. Aber es findet keine kontinuierliche Drehung statt. Die Schleife läuft zu ende und erst dann werden die Drehungen durchgeführt. Wie kann ich erreichen, dass nach jedem Schleifenschritt das Bild um eben die angleMinute gedreht wird?

    Die Rotation wird erst nach dem Verlassen der Methode ausgeführt; also wird das mit der while-Schleife nichts. Stattdessen solltest über einen Timer die Methode periodisch aufrufen; z. B. wie hier.
    „Meine Komplikation hatte eine Komplikation.“
  • Ich habe das jetzt mal über einen Time versucht. Das NSLog zeit mit dass jede Sekunde auf die Rotationsmethode zugegriffen wird. Aber mein Minutenzeiger rotiert nicht. Also irgendwo habe ich mich jetzt wahrscheinlich verbummelt.

    Was könnte denn die einfachste Möglichkeit sein, die repeat-Option nach 8*60 Sekunden abzubrechen? Das ist ja ein BOOL oder? also sollte ich da ja auch eine kleine schleife einbauen können, die die Sekunden mitzählt oder?

    Quellcode

    1. - (IBAction)startPressed:(id)sender
    2. {
    3. self.minutenTimer = [NSTimer
    4. scheduledTimerWithTimeInterval:1
    5. target:self selector: @selector(minutenZeiterRotation)
    6. userInfo:nil repeats: YES];
    7. }
    8. -(void)minutenZeiterRotation
    9. {
    10. NSLog(@"%s", __PRETTY_FUNCTION__);
    11. double angleMinute = 0.75*M_PI/180;
    12. CGAffineTransform rotationMinutenZeiger = CGAffineTransformMakeRotation(angleMinute);
    13. self.minutenZeiger.transform = rotationMinutenZeiger;
    14. }
    Alles anzeigen
  • Ich würde die Sekunden in einer property mitzählen (in der Timer-Methode). Daraus kannst du dann den Winkel direkt berechnen. In den paar Aufrufen wird macmoonshines Ansatz auch gehen, aber irgendwann können verkettete Transformationen Rundingsprobleme machen, außerdem weißt du dann immer genau, wo der Zeiger gerade ist und du kannst nach 8 * 60 Aufrufen dem Timer ein -invalidate schicken, was die Animation beendet.
    Multigrad - 360°-Produktfotografie für den Mac
  • Vielen Dank euch beiden.. das Teil dreht sich brav!!

    Ein Problem habe ich jetzt allerdings doch noch: Der Timer hört nicht nach (hier: 8 Sekunden) auf.

    Quellcode

    1. -- (IBAction)startPressed:(id)sender
    2. {
    3. NSDate *startingTime = [NSDate date];
    4. endingTime = [startingTime dateByAddingTimeInterval:8];
    5. self.minutenTimer = [NSTimer
    6. scheduledTimerWithTimeInterval:1
    7. target:self selector: @selector(minutenZeigerRotation)
    8. userInfo:nil repeats: YES];
    9. }
    10. -(BOOL)timecheck
    11. {
    12. NSDate *currentTime = [NSDate date];
    13. if (currentTime==endingTime)
    14. {
    15. return YES;
    16. } else {
    17. return NO;
    18. }
    19. }
    20. -(void)minutenZeigerRotation
    21. {
    22. if ([self timecheck]==YES) {
    23. [minutenTimer invalidate];
    24. }
    25. double angleMinute = 0.75*M_PI/180;
    26. self.minutenZeiger.transform = CGAffineTransformRotate(self.minutenZeiger.transform, angleMinute);
    27. NSLog(@"%f",angleMinute);
    28. }
    Alles anzeigen
  • volker schrieb:

    Naja, schon auch irgendwie die Objekte, dabe macht halt nicht ein Objektspezifisches compare: sondern Objekt1 == Objekt2 ... aber halt nicht deren Inhalte... aber Zeiger ist der genauere und treffendere Ausdruck... bin mir meienr Grammatik auch nicht immer so sicher

    Setz mal für Objekt eine konkreten Klassennamen: Vergleicht „==“ etwa (NS-)Strings oder (NS-)Arrays?

    Dieser Operator vergleicht nur Referenzen auf Objekte, und deshalb vergleicht er eben kelne Objekte.
    „Meine Komplikation hatte eine Komplikation.“
  • vielen Dank für die Hilfe. Habe das Problem jetzt folgendermaßen gelöst:

    Quellcode

    1. - (IBAction)startPressed:(id)sender
    2. {
    3. NSDate *startingTime = [NSDate date];
    4. endingTime = [startingTime dateByAddingTimeInterval:8];
    5. self.minutenTimer = [NSTimer
    6. scheduledTimerWithTimeInterval:1
    7. target:self selector: @selector(minutenZeigerRotation)
    8. userInfo:nil repeats: YES];
    9. }
    10. -(void)minutenZeigerRotation
    11. {
    12. NSDate *currentTime = [NSDate date];
    13. NSString *endingTimeString = [NSDateFormatter localizedStringFromDate:endingTime
    14. dateStyle:NSDateFormatterShortStyle
    15. timeStyle:NSDateFormatterFullStyle];
    16. NSLog(@"endingTime: %@",endingTimeString);
    17. NSString *currentTimeString = [NSDateFormatter localizedStringFromDate:currentTime
    18. dateStyle:NSDateFormatterShortStyle
    19. timeStyle:NSDateFormatterFullStyle];
    20. NSLog(@"currentTime: %@",currentTimeString);
    21. if ([currentTimeString isEqualToString: endingTimeString]==YES) {
    22. NSLog(@"blub");
    23. [self.minutenTimer invalidate];
    24. self.minutenTimer=nil;
    25. }
    26. double angleMinute = 0.75*M_PI/180;
    27. self.minutenZeiger.transform = CGAffineTransformRotate(self.minutenZeiger.transform, angleMinute);
    28. NSLog(@"%f",angleMinute);
    29. }
    Alles anzeigen


    weiß zwar nicht ob es die eleganteste Art ist, aber es funktioniert doch ganz gut :P
    Schönen Abend noch!