Question

J'ai une application de saisie de données dans laquelle l'utilisateur saisit environ 6 informations sur des vues différentes d'un contrôleur de navigation. Cela fonctionne bien, mais une fois que l'utilisateur est habitué à l'application, le temps nécessaire pour que l'écran suivant apparaisse ralentit l'utilisateur.

J'ai essayé l'application sans les animations, mais ça ne me semble pas très bien. Est-il possible d’obtenir les animations plus rapidement? J'utilise principalement un contrôleur de navigation, des vues de table et des vues de sélecteur.

Était-ce utile?

La solution

Il y aura une pénalité chaque fois que vous chargez une nouvelle vue, vous pouvez essayer de consolider les écrans en utilisant une vue par défilement ou une présentation différente. De plus, si vous chargez des graphiques inutiles, vous voudrez peut-être les supprimer.

Vous pouvez également ajouter vous-même chaque vue en tant que sous-vue, auquel cas vous pouvez notamment contrôler la durée de l'animation. Ce code le fera pour vous, mais méfiez-vous comme je viens de l'écrire 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

Autres conseils

Réutilisez-vous les cellules dans la vue tableau? Assurez-vous de bien les réutiliser, autrement dit, effectuez toute la configuration de la cellule dans le cas if (cell == nil) et appliquez les données uniquement dans le cas courant (s'appliquant à la fois à la réutilisation et à la création).

Soyez conscient de l'impact que la transparence peut avoir sur les performances d'une cellule. Il semble souvent que vous deviez rendre les choses transparentes, mais peut-être que non, car UITableViewCell est conscient des problèmes. La désactivation de la transparence dans certains objets peut sembler erronée, mais cela vaut la peine d'essayer de voir si cela fonctionne réellement. Le coût du défilement d'une cellule correspond en grande partie à la composition lorsque la cellule se déplace, et non à la création initiale de la cellule.

Une autre chose qui peut vous aider est de composer la vue que vous appliquez à l'avance à votre cellule plutôt que d'ajouter toutes les vues à la cellule, puis d'appliquer une seule vue prédéfinie à votre cellule.

Si vous animez des vues dans les cellules défilantes, vous devrez peut-être repenser cela ou au moins utiliser une simplification pour le rendre un peu moins éprouvant pour le périphérique.

Vous pouvez également envisager d'adopter la stratégie de Matt Gallagher pour la gestion des cellules . - cela empêche votre cellForRowAtIndexPath de se transformer en un long et méchant ensemble de ifs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top