2009-02-04 10 views
0

J'utilise un CALayer pour afficher un chemin via la méthode de délégation drawLayer:inContext, qui réside dans le contrôleur de vue de la vue à laquelle appartient le calque. Chaque fois que l'utilisateur déplace son doigt sur l'écran, le chemin est mis à jour et la couche est redessinée. Cependant, le dessin ne suit pas les touches: il y a toujours un léger décalage dans l'affichage des deux derniers points du chemin. Il scintille également, mais seulement en affichant à nouveau les deux derniers points. Si je fais juste le dessin dans le drawRect de la vue, cela fonctionne très bien et le dessin est définitivement assez rapide.CALayer scintille lors du tracé d'un tracé

Est-ce que quelqu'un sait pourquoi il se comporte comme ça? Je suppose que c'est quelque chose à voir avec la mise en mémoire tampon des calques, mais je n'ai trouvé aucune documentation à ce sujet.

+0

OS X, à droite? Il est possible que vous utilisiez des animations de propriétés implicites qui sont activées par défaut dans OS X. Vous pouvez essayer '[CATransaction begin]; [CATransaction setValue: @YES forKey: kCATransactionDisableActions]; ... dessiner ...; [CATransaction commit]; ' – nielsbot

Répondre

0

Vous pourriez avoir plus de chance en utilisant un layer hosting view.

Au lieu d'utiliser la drawLayer: inContext: méthode, la configuration de la vue que vous voulez et ajouter un CALayer à lui:

UIView *layerHosting = [[UIView alloc] initWithFrame:frame]; 
[layerHosting setLayer:[[CALayer new] autorelease]]; 

Hope that helps!

+1

Je n'ai jamais vu' [UIView new] 'avant (mais ça existe vraiment selon les docs d'Apple). Je recommande d'utiliser '[[UIView alloc] initWithFrame: frame]' et '[CALayer layer]', cependant, parce que c'est ainsi qu'ils sont destinés à être utilisés. – MrMage

+0

Vous devez utiliser '-initWithFrame:' ​​pour être sûr, puisque c'est l'initialiseur désigné. Probablement inoffensif cependant. (Vous pouvez simplement passer 'CGRectZero'.) – nielsbot

+0

Aussi, vous pouvez utiliser' + [CALayer layer] '(qui fonctionne pour ARC et non-ARC) vs' [[CALayer new] autorelease] '... – nielsbot

1

[UIView new] est simplement un raccourci pour [[UIView alloc] init].

+0

pas une réponse ... devrait être un commentaire. – nielsbot

1

Donnez les points suivants avant setNeedsDisplay méthode ::

[CATransaction begin]; 

[CATransaction setValue:[NSNumber numberWithFloat:someDelay] forKey:kCATransactionAnimationDuration]; 

[aLayer setNeedsDisplay];      
[CATransaction commit];