Question

Actuellement, j'ai une sous-classe UIView qui "tamponne". Un seul CGLayerRef 2px par 2px sur l'écran, jusqu'à 160 x 240 fois.

Je l’anime actuellement en déplaçant UIView "haut". l’écran 2 pixels (en fait, un UIImageView), puis tracez la "rangée" suivante.

L'utilisation de plusieurs calques CALayer accélérerait-elle les performances de rendu de cette animation?

Existe-t-il des tutoriels, des exemples d'applications ou des extraits de code pour utiliser CALayer avec le SDK de l'iPhone?

La raison pour laquelle je pose cette question est que la plupart des extraits de code que je trouve illustrent des exemples simples d’appels de méthode CALayer qui ne fonctionnent pas avec le SDK de l’iPhone. J'apprécie tous les conseils ou indications.

Était-ce utile?

La solution

Très bien, si vous voulez quelque chose qui contient de bons exemples de bons CA, qui dessine des choses comme ça et qui fonctionne au téléphone, je recommande GeekGameBoard code publié par Jens Aflke (version améliorée de certains codes de démonstration Apple).

D'après ce que vous décrivez, je pense que vous faites quelque chose de beaucoup plus compliqué que nécessaire. Mon impression est que vous voulez fondamentalement une vue statique que vous animez en déplaçant sa position de sorte qu'elle soit partiellement hors écran. Si vous avez juste besoin de définir du contenu statique dans votre drawRect, le passage de calques ne sera pas plus rapide que d'appeler simplement CGFillRect () avec votre couleur. Après cela, vous pouvez simplement utiliser des animations implicites et le proxy d’animation sur UIView pour déplacer la vue. Je suppose que vous pourriez même vous débarrasser de drawRect personnalisé: implémentation avec un motif UIColor, mais honnêtement, je n’ai pas évalué la différence entre les deux.

Autres conseils

Quelles méthodes CALayer voyez-vous qui ne fonctionnent pas sur iPhone? Mis à part les fonctionnalités d'animation liées à CoreImage, je n'ai pas remarqué beaucoup de choses qui manquent. La chose importante que vous remarquerez probablement est que toutes les vues sont sauvegardées sur des couches (vous n'avez donc rien à faire de spécial pour utiliser des couches, vous pouvez simplement saisir une couche UIView à travers les méthodes d'accès des couches), et le système de coordonnées possède une image supérieure. origine gauche.

Dans tous les cas, avoir plus de choses est généralement plus lent que d’avoir moins de choses. Si vous ne faites que répéter le même motif encore et encore, vous constaterez probablement que la meilleure performance consiste à implémenter un UIView / CALayer / UIColor personnalisé qui sait dessiner ce que vous voulez, plutôt que de placer des calques ou des vues visuellement identiques les uns à côté des autres .

Cela dit, les couches ont généralement un poids inférieur à celui des vues. Par conséquent, si vous devez séparer logiquement de nombreux éléments distincts, vous constaterez que le passage à des couches peut s'avérer avantageux pour les vues.

Vous voudrez peut-être regarder - [UIColor initWithPatternImage:] en fonction de ce que vous essayez de faire. Si vous utilisez ce motif de deux pixels comme couleur d’arrière-plan, vous pouvez créer une UIColor qui le dessine et définit l’arrière-plan.

Quelles méthodes CALayer voyez-vous qui ne fonctionnent pas sur iPhone?

A titre d'exemple, j'ai essayé de mettre en œuvre la démonstration de la grille ici , sans trop de chance. Il semble que CAConstraintLayoutManager et CAConstraint ne soient pas disponibles dans QuartzCore.h .

Dans une autre tentative, j’ai essayé un petit objet très simple CALayer 20x20 comme sous-couche de la propriété de couche de mon UIView , mais cela ne s’est pas présenté.

À l'heure actuelle, j'ai un UIView personnalisé dont je remplace la méthode drawRect . Dans drawRect , je saisis un contexte et rend deux types de CGLayerRef :

At " off " cellules, je dessine la couleur d’arrière-plan sur l’ensemble de la toile 320x480.

At " on " Je trace un seul CGLayerRef sur une grille de 320 x 480 pixels (initialisation) ou sur une ligne de 320 x 2 (animation).

Pendant l'animation, je crée une vue de clip UIImageView à partir de 320x478 pixels et dessine une seule ligne. Cela "pousse" mon bitmap à l'écran deux pixels à la fois.

En gros, j'aimerais vérifier si CALayer accomplit ou non deux choses:

  1. Rendre mon rendu plus rapide si CALayer génère moins de temps système que ce que je fais maintenant
  2. Rendre l’animation plus fluide en me permettant de passer d’une couche à l’autre sur l’écran

Malheureusement, je ne parviens pas à faire fonctionner un CALayer basique pour le moment et je n'ai pas trouvé un bon échantillon de code à regarder et avec lequel jouer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top