2010-10-13 4 views
0

Je fais des animations en utilisant l'animation UIView et presentModalViewController. Grâce au simulateur, il semble bien, mais sur l'appareil c'est plutôt saccadé. Même des vues assez basiques par exemple un viewController avec un UISearchBar, UITableView (vide) avec une couleur personnalisée et un bouton sur la barre de navigation est saccadé quand il est animé par presentModalViewController.Problème de performance de l'animation UIView

J'ai essayé de charger la vue en mémoire sur le chargement de l'application et de la présenter quand un bouton est pressé pour voir s'il y a une différence mais c'est le même résultat. Comme une note je crée les objets dans le code et les ajoute à la vue de viewControllers, je n'utilise pas de pointes.

Il y a quelques vues que tout ce que j'anime est une barre de tâches ou une propriété alpha et celles-ci s'animent bien.

Des astuces qui pourraient aider? Est-ce quelque chose qui serait corrigé lors de la sortie de l'application?

+0

Vous n'implémentez drawRect dans aucun de ces cas? – Nimrod

+0

Pas dans les simples. J'ai dans un ou deux d'entre eux mais l'endroit que j'ai utilisé drawRect anime bien. – Rudiger

Répondre

2

Un grand nombre d'objets UIKit s'affichent assez lentement (comme UITextViews et UISegmentedControllers), de sorte qu'ils peuvent sembler saccadés si vous essayez d'en animer beaucoup en même temps. Chaque image de l'animation nécessite que la vue soit redessinée.

Vous pouvez accélérer le processus en convertissant ces vues lentes en UIImageViews qui peuvent être animées beaucoup plus facilement. Essayez d'appeler la méthode suivante avant de faire des animations:

[self flattenView:yourView forDuration:0.5]; 


-(void)flattenView:(UIView *)view forDuration:(CGFloat)duration 
{ 
    UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, [[UIScreen mainScreen] scale]); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIImageView * imgV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, view.frame.size.width, view.frame.size.height)]; 
    imgV.image = img; 
    [view addSubview:imgV]; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
     [imgV removeFromSuperview]; 
    }); 
}