2009-10-22 10 views
1

J'ai une application de saisie de données qui permet à l'utilisateur d'entrer environ 6 informations sur des vues différentes dans un contrôleur de navigation. Cela fonctionne très bien, mais une fois que l'utilisateur s'habitue à l'application, le temps nécessaire pour que l'écran suivant apparaisse ralentit l'utilisateur.Accélérer les animations iPhone

J'ai essayé l'application sans les animations, mais cela ne me semble pas tout à fait correct. Y a-t-il un moyen d'obtenir des animations plus rapidement? J'utilise principalement un contrôleur de navigation, des vues de table et des vues de sélecteur.

Répondre

2

Il y aura une pénalité chaque fois que vous chargez une nouvelle vue, vous pourriez essayer de consolider les écrans en utilisant une vue déroulante ou une disposition différente. En outre, si vous chargez des graphiques inutiles, vous pouvez les supprimer.

Vous pouvez également ajouter chaque vue en tant que sous-vue, auquel cas vous avez entre autres le contrôle sur la durée de l'animation. Ce code va le faire pour vous, même s'il faut se méfier car je l'ai juste écrit et je ne l'ai pas testé (le style de transition et les paramètres booléens peuvent être supprimés car ils ne font rien pour le moment).

UIViewControllerExtendedPresentModalViewController.h

#import <Foundation/Foundation.h> 

typedef enum _ExtendedModalTransitionStyle 
{ 
    ExtendedModalTransitionStyleTopDown 
} ExtendedModalTransitionStyle; 

@interface UIViewController (ExtendedPresentModalViewController) 
- (void)presentModalViewController: (UIViewController*)modalViewController 
       withTransitionStyle: (ExtendedModalTransitionStyle)style 
          animated: (BOOL)animated; 

- (void)dismissModalViewController: (UIViewController*)modalViewController 
       withTransitionStyle: (ExtendedModalTransitionStyle)style 
          animated: (BOOL)animated; 
@end 

UIViewControllerExtendedPresentModalViewController.m

#import "UIViewControllerExtendedPresentModalViewController.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation UIViewController (ExtendedPresentModalViewController) 

    - (void)presentModalViewController: (UIViewController*)modalViewController 
        withTransitionStyle: (ExtendedModalTransitionStyle)style 
           animated: (BOOL)animated 
    { 
     [modalViewController retain]; // we'll need this for a little while, hang on to it. 

     CATransition* transition = [CATransition animation]; 
     [transition setDuration: 0.4]; 
     [transition setTimingFunction: 
     [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear]]; 
     [transition setType: kCATransitionMoveIn]; 
     [transition setSubtype: kCATransitionFromBottom]; 
     [[[self view] layer] addAnimation: transition 
            forKey: nil]; 
     [[self view] addSubview: [modalViewController view]]; 
    } 

    - (void)dismissModalViewController: (UIViewController*)modalViewController 
        withTransitionStyle: (ExtendedModalTransitionStyle)style 
           animated: (BOOL)animated 
    { 
     CATransition* transition = [CATransition animation]; 
     [transition setDuration: 0.4]; 
     [transition setTimingFunction: 
     [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear]];//kCAMediaTimingFunctionEaseInEaseOut]]; 
     [transition setType: kCATransitionReveal]; 
     [transition setSubtype: kCATransitionFromTop]; 
     [[[[modalViewController view] superview] layer] addAnimation: transition 
                   forKey: nil]; 
     [[modalViewController view] removeFromSuperview]; 

     [modalViewController release]; // all done, we can let this go. 
    } 
    @end 
+0

Merci, je vais essayer ça. –

+0

Il va augmenter la quantité de gestion que vous aurez à faire, mais pourrait vous donner la vitesse supplémentaire dont vous avez besoin. – jessecurry

+0

Je n'ai pas eu le temps d'essayer ce code spécifique, mais il est évident que je vais devoir faire toutes les transitions moi-même (comme vous le suggérez) au lieu de me fier au comportement normal. –

0

Est-ce que vous réutilisez des cellules dans la vue tabulaire? Assurez-vous de vraiment les réutiliser, en d'autres termes, faites toute la configuration de la cellule à l'intérieur du cas if (cell == nil) et n'appliquez les données que dans le cas courant (s'appliquant à la fois à la réutilisation et à la création).

Soyez conscient de l'impact sur les performances que la transparence peut avoir dans une cellule. Souvent, il semble que vous deviez rendre les choses transparentes, mais peut-être que non parce que UITableViewCell est conscient des problèmes. La désactivation de la transparence dans certains objets peut sembler incorrecte, mais cela vaut la peine d'essayer de voir si cela fonctionne réellement. La plus grande partie du coût du défilement d'une cellule est la composition au fur et à mesure que la cellule se déplace, et non la création de la cellule initialement. Une autre chose qui peut aider à faire la composition de la vue que vous appliquez à votre cellule à l'avance plutôt que d'ajouter toutes les vues à la cellule, alors vous n'appliquez qu'une seule vue premade à votre cellule. Si vous êtes en train d'animer des vues dans les cellules de défilement, vous devrez peut-être repenser cela ou au moins utiliser une certaine simplification pour le rendre un peu moins lourd sur l'appareil.

Vous pouvez également envisager d'adopter Matt Gallagher's strategy for cell handling - cela empêche votre cellForRowAtIndexPath de se transformer en un long ensemble d'ifs.

+0

Je ne pense pas qu'il y ait un problème de performance dans mon code - si je me débarrasser des animations de l'interface utilisateur est beaucoup plus Snappy mais beaucoup moins iPhone-like. Le problème est simplement que l'animation prend du temps. Au lieu d'une animation qui prend 0,5 secondes à courir, je voudrais qu'il s'exécute en 0.25 secondes. Voici un faux exemple pour le rendre plus clair. Aller à l'application de calendrier et appuyez sur la flèche droite pour obtenir le calendrier pour aller au mois suivant. Le mois prochain va glisser visuellement dans la vue. Ma question est de savoir comment je pourrais voir le mois prochain plus rapidement. –

+1

Je l'ai maintenant - bien je l'ai vu: http://everburning.com/news/flicking-the-iphone/ mais il y a un peu de travail manuel à faire.Je ne pense pas que vous pouvez changer la vitesse des transitions du système telles que celles causées par pushViewController: withAnimation d'une manière qui mènera à l'approbation de l'application. Je connais d'une façon à travers l'accès aux méthodes privées qui ont semblé cesser de travailler avec la version 3.0. –