2010-11-02 2 views
0

Je souhaite afficher le même UIView plusieurs fois. Pour le moment, j'ai mon dessin dans un UIView primaire, puis copiez ceci dans une image en utilisant renderInContext: et UIGraphicsGetImageFromCurrentImageContext. Ensuite, je définis le contenu des autres UIViews proxy pour être cette image.Dupliquer les UIViews

UIGraphicsBeginImageContext(size); 

[self.layer renderInContext:UIGraphicsGetCurrentContext()]; 

UIImage * clonedImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

return [clonedImage CGImage]; 

Je rencontre un goulot d'étranglement dans le renderInContext: appeler, sans doute parce qu'il doit copier l'image de la vue. Je vois des points chauds dans resample_byte_h_3cpp et resample_byte_v_Ncpp, mais je ne suis pas sûr de ce qu'ils font.

Est-il possible d'afficher le même UIView plusieurs fois pour réduire cette surcharge? Ou y a-t-il un moyen plus efficace de rendre l'image?

+0

De quel type de UIView faites-vous référence? – matheeeny

+0

C'est un descendant UIView avec une image d'arrière-plan et quelques superpositions CAShapeLayer. – Douglas

Répondre

1

Que diriez-vous de faire une copie de l'UIImage au lieu de générer de nouvelles images encore et encore à partir de l'UIView?

//.. Create the clonedImage from UIView 

CGImageRef cgImageRef = [clonedImage CGImage]; 
UIImage *twinImage = [[UIImage alloc] initWithCGImage:cgImageRef]; 

//.. Use the images 

[clonedImage release]; // if needed 
[twinImage release]; // if needed 
+0

Je suis en train de mettre à jour la source UIView, et j'aimerais voir ces mises à jour sur tous les proxys. Je peux juste supporter le décalage mineur sur l'iPhone 3G pour cette version (environ 100-200ms) et réécrire ce bit de l'application en utilisant OpenGL dans le futur. Il fonctionne bien tel quel sur l'iPad. – Douglas

+0

OK, alors vous devriez vérifier Grand Central Dispatch. Il vous permet de configurer des files d'attente et d'exécuter du code par lots, en fonction du moment où le code est terminé. Il fonctionnera également en arrière-plan, qui ne cherche pas l'application et/ou son interface utilisateur. – runmad