Domanda

Ho un'applicazione per l'immissione di dati che consente all'utente di inserire circa 6 informazioni tutte su viste diverse in un controller di navigazione. Funziona bene, ma una volta che l'utente si è abituato all'applicazione, il tempo necessario per la visualizzazione della schermata successiva rallenta l'utente.

Ho provato l'applicazione senza le animazioni, ma non mi sembra giusto. C'è un modo per far sì che le animazioni si verifichino più rapidamente? Uso principalmente un controller di navigazione, le visualizzazioni delle tabelle e le visualizzazioni dei selettori.

È stato utile?

Soluzione

Ci sarà una penalità ogni volta che carichi una nuova vista, potresti provare a consolidare le schermate usando una vista di scorrimento o un layout diverso. Inoltre, se si stanno caricando elementi grafici non necessari, è possibile rimuoverli.

Puoi anche aggiungere ogni vista come sottoview, nel qual caso hai il controllo sulla durata dell'animazione tra le altre cose. Questo codice lo farà per te, anche se fai attenzione quando l'ho appena scritto e non lo ho testato (lo stile di transizione e i parametri booleani possono essere rimossi in quanto non fanno nulla in questo 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

Altri suggerimenti

Stai riutilizzando le celle nella vista tabella? Assicurati di riutilizzarli davvero, in altre parole esegui tutte le impostazioni della cella all'interno del caso if (cell == nil) e applica i dati solo nel caso comune (applicando sia al riutilizzo sia alla nuova creazione).

Prestare attenzione al risultato delle prestazioni che può avere la trasparenza in una cella. Spesso sembra che devi rendere le cose trasparenti, ma forse non lo fai perché UITableViewCell è consapevole dei problemi. Disattivare la trasparenza in alcuni oggetti potrebbe sembrare sbagliato, ma vale la pena provare a vedere se funziona davvero. La maggior parte del costo dello scorrimento di una cella è la composizione mentre la cella si muove, non inizialmente la creazione della cella.

Un'altra cosa che può aiutare è fare la composizione della vista che applichi in anticipo alla tua cella piuttosto che aggiungere tutte le viste alla cella, quindi applichi solo una vista premade alla tua cella.

Se in realtà stai animando le viste nelle celle a scorrimento, potresti dover ripensare a questo o almeno usare una semplificazione per renderlo un po 'meno tassativo sul dispositivo.

Potresti anche prendere in considerazione l'adozione di la strategia di Matt Gallagher per la gestione delle cellule - impedisce a cellForRowAtIndexPath di trasformarsi in un lungo e brutto insieme di if.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top