Dessin les malheurs CALayer
Tout d'abord, im trouver l'iPhone en ligne docs être pas si bien à fond clair quand il s'agit de diverses façons de rendre un calque. Je reçois le jist de lui, mais je ne suis pas clair quand à utiliser les méthodes et qui exige de la couche d'ajouter, comme une sous couche ou pas.
Mon projet a commencé banalement avec moi le chargement des images et tout simplement en les attirant vers une UIView via [image drawAtPoint:] ainsi que [image drawInRect:]. Ces travaux fine à l'aide de l'actuel contexte graphique.
Alors aujourd'hui, j'ai passé à lire ce concept de l'utilisation de couches de sorte que l'animation de mes différentes images (implicitement) serait, en théorie, être un jeu d'enfant!
Pour l'enregistrement, je sais que les docs disent-classement CALayer est inutile, mais je n'ai que ça.
Maintenant, je suis incroyablement confus au sujet des différentes façons pour soi-disant rendre une couche.
- drawLayer
- displayLayer
- affichage
- drawInContext
Maintenant pour toutes ces méthodes, il est nécessaire de définir la couche de la taille de l'image?
Est-il nécessaire d'ajouter une couche à une vue de couche?
La seule méthode qui me donne des résultats visibles est la drawinContext méthode. Mais si je demande implicite de l'animation (par exemple image.opacity = 0) il ne se passe rien, ce qui me fait croire que ma couche n'est pas correctement configuré.
Quelques une, merci de rétablir l'ordre à ce chaos.
OriginalL'auteur AlvinfromDiaspar | 2009-08-20
Vous devez vous connecter pour publier un commentaire.
Core Animation permet de faire ce genre de chose triviale. Brad suggestion est à droite sur. La ligne de fond est que vous n'avez pas besoin de toutes ces méthodes de simplement rendre la couche. Dans le but de provoquer la couche à rendre, assurez-vous que vous avez effectué les opérations suivantes:
Définir le contenu de la propriété avec:
[imageLayer setContents:(id)[[UIImage imageNamed@"image.png"] CGImage]];
Définir les limites de la couche à la taille que vous voulez.
[imageLayer setBounds:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];
De définir la position (x,y) de la couche à afficher dans la vue. La valeur par défaut anchorPoint est le centre de la couche. Ce code des centres de la couche de votre point de vue.
[imageLayer setPosition:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];
Ajouter la couche à votre point de vue de la couche:
[[[self view] layer] addSublayer:imageLayer];
D'ailleurs, si vous préférez, vous pouvez régler à la fois les limites et la position d'une méthode par appel setFrame:. Je préfère utiliser les deux appels de moi-même qu'il se sent le plus lisible pour moi, mais c'est de votre propre préférence. Si vous ne définissez pas les limites et la position ou de la trame de la couche, cependant, la couche ne sera pas rendu.
Si vous le préférez, vous pouvez éviter d'utiliser drawInContext en créant des couches supplémentaires qui attirent des chemins, des formes (voir CAShaperLayer), ou d'autres images et les ajouter en tant que sous-couches de votre calque de l'image ou les ajouter en tant que sous-couches de votre couche de parent et de leur donner un zPosition qui provoque l'affichage en face de votre calque de l'image.
Maintenant, si vous voulez animer l'opacité, vous pouvez utiliser implicite de l'animation en définissant simplement la propriété de calque dans la manière exacte que vous avez décrit, par exemple, [imageLayer setOpacity:0.0 f]; Ce sera fondu à la couche et tous les calques enfants de plus de 0.25 secondes.
Juste quelques réflexions supplémentaires.
Meilleures Salutations.
OriginalL'auteur Matt Long
Si tout ce que vous voulez de vos différentes couches à faire, c'est afficher une image de chaque, vous ne devriez pas besoin d'une sous-classe. Vous devez simplement être en mesure de définir une image (dans CGImageRef forme) à la
contents
de la propriété de chaque couche. La couche sera alors en charge le dessin de l'image. Vous pouvez obtenir les Graphiques de Base de l'image de la représentation d'une UIImage à l'aide de sonCGImage
propriété en lecture seule.Vous sont corrects, bien que, sur
-drawInContext:
être le bon endroit pour mettre plus de code de dessin personnalisé au sein d'un CALayer sous-classe. Sans sous-classement CALayer, vous pouvez avoir un délégué du changement de la couche de dessin de comportement par le biais de la-drawLayer:inContext:
délégué de la méthode.Ce sont tous décrits en détail dans le "En Fournissant Le Contenu D'Un Calque" section d'Apple Core Animation Guide De Programmation.
Ici, c'est un plus pertinents à la question de suivi: je peux maintenant rendu à un calque à l'aide de drawLayer:(CALayer*)de la couche. Cependant, si je veux mettre à jour le rendu, disons, une image d'animation, sur la couche, si j'ai mis le contenu du calque avec une image mise à jour*, le contenu disparaît sur l'écran. Dois-je supprimer le calque de rendu, puis l'ajouter à nouveau à la file d'arbre? Si c'est le cas, ce souffle!
Pour votre première question: drawInContext: ne devrait jamais être appelé directement, mais indirectement déclenchée par setNeedsDisplay. Si vous n'avez pas remplacé la méthode, je crois qu'il appelle à le délégué à l'aide de l'affichage du contenu via-drawLayer:inContext:
Pour votre deuxième question: vous devriez être en mesure de changer ce que vous voulez sur le contenu du calque, soit par le contenu de la propriété ou -drawInContext:, sans le retirer et de le rajouter à la hiérarchie des calques. Il doit y avoir quelque chose de mal avec vos méthodes de rendu.
OriginalL'auteur Brad Larson