2012-06-12 3 views
0

Ce que j'essaie de faire, c'est d'animer une étiquette lorsque la minuterie est activée. J'ai une application basée sur une fenêtre. J'ai essayé l'animation de base dans une boucle while, mais le programme se fige tout seul. Core Animation et NSTimer

  • J'ai essayé l'animation de base déclenchée par une minuterie (NSTimer), mais rien ne se passe. Problème: J'ai débogué le programme, tout semble correct, toutes les instructions sont en cours d'exécution, mais rien ne se passe. Je pensais que l'animation de base dans une boucle ou déclenchée par une minuterie n'est pas autorisée. Est-ce qu'il y a un autre moyen ?

    Ce que j'est:

    drawingTimer = [NSTimer scheduledTimeWithTimeInterval:60.0 target:self 
           selector:@selector(slideWords) userInfo:nil repeats:NO]; 
    
    -void (slideWords){ 
    randomNumber = 1 + arc4Random()%2; 
    
    if(randomNumber = 1){ 
        Redlabel.alpha = 1.0; 
        RedLabel.frame = CGRectMake(0, -50, 320, 100); 
        [UIWindow animateWithDuration:5.0 animations:^{ 
         Redlabel.alpha = 1.0; 
         Redlabel.frame = CGRectMake(0,300,320,100); 
        }completion:^(BOOL finished){ 
         [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
          Redlabel.alpha = 0.0; 
         }completion:^(BOOL finished){ 
         }]; 
        }]; 
    } 
    
    if(randomNumber = 2){ 
        GreenLabel.alpha = 1.0; 
        GreenLabel.frame = CGRectMake(0, -50, 320, 100); 
        [UIWindow animateWithDuration:5.0 animations:^{ 
         GreenLabel.alpha = 1.0; 
         GreenLabel.frame = CGRectMake(0,300,320,100); 
        }completion:^(BOOL finished){ 
         [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
          GreenLabel.alpha = 0.0; 
         }completion:^(BOOL finished){ 
         }]; 
        }]; 
    } 
    

    }

  • +0

    N'a pas lu le tout, mais vos conditions ne font que des tâches. Les deux seront évalués comme vrai, et modifier randomNumber. De plus, les niveaux alpha sont assignés à 1, puis animés à 1 (non-op). – danh

    +0

    quand je viens d'écrire les lignes dans RedLabel.alpha ..... reste; le programme fonctionne bien. Le problème devrait être déclenché par un NSTimer ou dans une boucle, donc je cherche des alternatives. –

    +0

    De même, vous définissez les cadres des deux étiquettes sur le même rect, puis vous les animez sur le même rect. On sera toujours caché. Je pense que vous devriez recommencer et simplifier radicalement: pas de boucle ou de minuterie, pas de hasard. Juste obtenir une étiquette qui s'estompe et qui bouge comme vous le voulez (peut-être ajouter un bouton temporaire pour le déclencher). Ensuite, faites la deuxième étiquette. Puis hardcode les deux cas aléatoires que vous voulez, puis ajoutez le hasard ... et ainsi de suite. Vous y arriverez! – danh

    Répondre

    1

    Comme danh dit dans son commentaire, vos deux si les déclarations doivent être

    if (randomNumber == value) 
    

    A est égal à un seul n'est pas un opérateur de comparaison , c'est un opérateur d'affectation. Le compilateur devrait vous donner un avertissement à ce sujet. En second lieu, animateWithDuration est une méthode UIView, pas une méthode UIWindow. Je suppose que le compilateur autorise ce que vous avez écrit parce que UIWindow hérite de UIView, mais envoyer un message de classe à une sous-classe qui n'implémente pas cette méthode est une mauvaise idée.

    Vos méthodes d'animation doivent lire

    [UIView animateWithDuration: x... 
    

    En troisième lieu, Core Animation avec une minuterie déclenchée devrait fonctionner très bien. Cependant, puisque votre minuteur ne se répète pas, pourquoi utiliser un minuteur? Utilisez la forme de la méthode d'animation qui prend un retard et nettoyez votre code. Ensuite, vous n'avez pas besoin d'une minuterie ou d'une méthode séparée "slideWords" du tout. Votre code pourrait ressembler à ceci:

    randomNumber = 1 + arc4Random()%2; 
    
    if(randomNumber = 1){ 
        Redlabel.alpha = 1.0; 
        RedLabel.frame = CGRectMake(0, -50, 320, 100); 
        [UIWindow animateWithDuration:5.0 
         delay: 60.0 
         options: 0 
         animations:^{ 
         Redlabel.alpha = 1.0; 
         Redlabel.frame = CGRectMake(0,300,320,100); 
        }completion:^(BOOL finished){ 
         [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
          Redlabel.alpha = 0.0; 
         }completion:^(BOOL finished){ 
         }]; 
        }]; 
    } 
    
    if(randomNumber = 2){ 
        GreenLabel.alpha = 1.0; 
        GreenLabel.frame = CGRectMake(0, -50, 320, 100); 
        [UIWindow animateWithDuration:5.0 
         delay: 60.0 
         options: 0 
         animations:^{ 
         GreenLabel.alpha = 1.0; 
         GreenLabel.frame = CGRectMake(0,300,320,100); 
        }completion:^(BOOL finished){ 
         [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
          GreenLabel.alpha = 0.0; 
         }completion:^(BOOL finished){ 
         }]; 
        }]; 
    } 
    

    Quatrième: Il y a une convention de nommage forte à Cocoa que vous devez suivre. Les noms de méthodes et de variables doivent commencer par une lettre minuscule et chaque mot du nom doit être en majuscule. Seuls les noms de classe doivent être en majuscules. (Les fonctions Core d'Apple suivent des règles de nommage différentes, mais ce ne sont pas des méthodes, ce sont des fonctions C ...)

    Ainsi votre "RedLabel" devrait être "redLabel" et "GreenLabel" devrait être "greenLabel"

    +0

    Cette fois, vous avez un problème avec UIView. [window setHidden: YES]; [newGameView setHidden: NO]; Tout ce que je reçois est un écran vide.Je sais que je manque de codage dans l'objectif c. Merci quand même. –

    +0

    Je ne pense pas que vous devriez jamais mettre la fenêtre à caché: OUI. Cela cacherait TOUT et vous donnerait un écran noir. Sur iOS, une fenêtre est en charge de l'intégralité de l'écran et héberge l'affichage du contenu du contrôleur de vue en cours. –

    Questions connexes