Pregunta

Tengo una aplicación de ingreso de datos que hace que el usuario ingrese aproximadamente 6 datos en diferentes vistas en un controlador de navegación. Esto funciona bien, pero una vez que el usuario se acostumbra a la aplicación, el tiempo que demora la aparición de la siguiente pantalla ralentiza al usuario.

Probé la aplicación sin las animaciones, pero no se siente del todo bien. ¿Hay alguna manera de hacer que las animaciones ocurran más rápido? Principalmente utilizo un controlador de navegación, vistas de tabla y vistas de selector.

¿Fue útil?

Solución

Habrá una penalización cada vez que cargues una nueva vista, podrías intentar consolidar las pantallas usando una vista de desplazamiento o un diseño diferente. Además, si está cargando gráficos innecesarios, es posible que desee eliminarlos.

También puede agregar cada vista como una subvista, en cuyo caso tiene control sobre la duración de la animación, entre otras cosas. Este código lo hará por usted, aunque tenga cuidado ya que lo escribí y no lo probé (el estilo de transición y los parámetros booleanos pueden eliminarse ya que no hacen nada en este momento).

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

Otros consejos

¿Estás reutilizando celdas en la vista de tabla? Asegúrese de reutilizarlos realmente; en otras palabras, haga toda la configuración de la celda dentro del caso if (cell == nil) y solo aplique los datos en el caso común (se aplica tanto a la reutilización como a la nueva creación).

Tenga en cuenta el impacto en el rendimiento que puede tener la transparencia en una celda. A menudo, parece que tiene que hacer las cosas transparentes, pero tal vez no, porque UITableViewCell es consciente de los problemas. Desactivar la transparencia en algunos objetos puede parecer incorrecto, pero vale la pena intentarlo para ver si realmente funciona. La mayor parte del costo de desplazar una celda es la composición a medida que la celda se mueve, no la creación de la celda inicialmente.

Otra cosa que puede ayudar es hacer la composición de la vista que aplicas a tu celda de antemano en lugar de agregar todas las vistas a la celda, luego solo aplicas una vista prefabricada a tu celda.

Si en realidad está animando vistas en las celdas de desplazamiento, es posible que deba repensar eso o al menos usar una simplificación para que sea un poco menos exigente para el dispositivo.

También puedes considerar adoptar la estrategia de Matt Gallagher para el manejo celular - detiene su cellForRowAtIndexPath convirtiéndose en un conjunto de ifs largo y desagradable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top