À L'Aide De CALayer Délégué
J'ai une UIView dont les couches ont des sous-couches. J'aimerais attribuer des délégués pour chacune de ces sous-couches, de sorte que le délégué méthode peut dire la couche de quoi dessiner. Ma question est:
Que dois-je fournir comme CALayer du délégué? La documentation dit de ne pas utiliser le UIView les couches de résidence, tel que cela est réservé pour les principaux CALayer de la vue. Mais, la création d'une autre classe juste pour être le délégué de la CALayers je créer défaites le but de ne pas sous-classement CALayer. Ce sont des personnes généralement en utilisant en tant que délégué pour CALayer? Ou devrais-je simplement une sous-classe?
Aussi, pourquoi est-ce que la classe implémentant le délégué méthodes n'ont pas à se conformer à une sorte de CALayer protocole? C'est une vaste question générale, je ne comprends pas très bien. Je pensais que toutes les classes nécessitant la mise en œuvre de déléguer les méthodes de spécification de protocole pour les agents à respecter.
- Je peux confirmer que l'utilisation d'un contenant de vue en tant que délégué bloque l'application, sans une trace de la pile, même si je ne suis pas d'appliquer le délégué des méthodes.
- Avez-vous jamais obtenir que cela fonctionne?
- J'ai fini par créer une classe qui sous-classe NSObject, qui réside dans le même fichier que celui de la vue, nommé quelque chose comme <UIView>LayerDelegate. Le but de ce cours est spécifiquement pour gérer le délégué de rappel. Il est assez facile à maintenir car ils sont dans le même fichier. Cette classe est la seule méthode est drawLayer:inContext: poignées et le dessin.
Vous devez vous connecter pour publier un commentaire.
Le plus léger-wight solution serait de créer une petite classe d'assistance dans le fichier comme le UIView c'est à l'aide de la CALayer:
Dans Mavue.h
Dans Mavue.m
Juste la place de ceux en haut de votre fichier, immédiatement au-dessous de la #directives d'importation. De cette façon, il se sent plus comme à l'aide d'un "cours privé" pour gérer le dessin (bien qu'il ne l'est pas, le délégué de classe peut être instancié par un code que les importations de l'en-tête).
@interface
à l'intérieur de l' .m fichier pour une meilleure classe impression. Si vous avez besoin de se référer à la classe dans le .h de fichier (par exemple, pour une ivar), vous pouvez utiliser de l'avant déclarations comme@class MyLayerDelegate;
.CALayer
et dessinez-y si vous avez une seule couche.Préférant garder la couche délégué méthodes dans mon sous-classe UIView, j'utilise une base de re-la délégation de délégué de classe. Cette classe peut être réutilisé sans personnalisation, en évitant le recours à la sous-classe CALayer ou de la création d'un délégué de classe juste pour la couche de dessin.
avec cette mise en œuvre:
Le nom de la couche est utilisé pour permettre couche par couche personnalisée méthodes draw. Par exemple, si vous avez attribué un nom à votre couche, dire
layer.name = @"Background";
, alors vous pouvez mettre en œuvre une méthode comme ceci:Note, vous aurez besoin d'un solide de référence de l'instance de cette classe, et il peut être utilisé en tant que délégué pour n'importe quel nombre de couches.
Prendre un coup d'oeil à la docs formel vs informel protocoles. Le CALayer est la mise en œuvre d'un protocole informel qui signifie que vous pouvez définir n'importe quel objet à son délégué, et il permettra de déterminer si elle peut envoyer des messages à ce délégué par la vérification de la délégué pour un sélecteur (c-à -respondsToSelector).
En général, je utiliser mon point de vue, contrôleur en tant que délégué de la couche en question.
Une remarque concernant "l'aide" des classes pour l'utiliser comme une couche délégué (avec ARC): au moins
Assurez-vous de stocker un "fort" en référence à votre allocation/init avait de la classe helper (comme dans une propriété). Tout simplement l'attribution de l'allocation/init avait de la classe helper pour le délégué semble provoquer des accidents pour moi, sans doute parce que mylayer.déléguer est une référence faible à votre classe d'aide (comme la plupart des délégués sont), donc la classe helper obtient libéré avant que la couche de pouvoir l'utiliser.
Si je attribuer la classe helper pour un bien, puis l'assigner à la délégué, mes étranges accidents de disparaître, et les choses se comportent comme prévu.
J'ai personnellement voté pour Dave Lee solution ci-dessus comme étant les plus de l'encapsulation, en particulier dans le cas de plusieurs couches. Cependant, lorsque je l'ai essayé sur IOS 6 avec l'ARC j'ai eu des erreurs sur cette ligne et de suggérer que j'ai besoin d'une passerelle en fonte
J'ai donc modifié Dave Lee drawLayer méthode de re-la délégation de délégué de classe à employer NSInvocation comme ci-dessous. Toute utilisation et les fonctions auxiliaires sont identiques à ceux de Dave Lee a posté sur son antérieures excellente suggestion.
Je préfère la solution suivante. Je voudrais utiliser le
drawLayer:inContext:
méthode de la UIView de rendre une sous-vue que je pourrais ajouter, sans ajout de classes de tous sur la place. Ma solution est la suivante:Ajouter les fichiers suivants dans votre projet:
UIView+UIView_LayerAdditions.h avec le contenu:
UIView+UIView_LayerAdditions.m avec le contenu
Maintenant ajouter l'en-tête de votre
.pch
fichier. Si vous ajoutez un calque à l'aide de lacreateSublayer
méthode, il sera automatiquement, sans mauvaises allocations dans le remplacement dedrawLayer:inContext:
. Autant que je sache, la charge de cette solution est minime.Il est possible de mettre en œuvre une délégation sans avoir recours à une forte réf.
REMARQUE: Le concept de base est que vous transférez le délégué appel à un sélecteur d'appel
Pour voir un exemple de comment mettre en œuvre le sélecteur de construction:(Permalink) https://github.com/eonist/Element/wiki/Progress#selectors-in-swift
REMARQUE: pourquoi faisons-nous cela? parce que la création d'une variable en dehors de méthodes chaque fois que vous souhaitez utiliser le Graphique de la classe est non-sensiques
REMARQUE: Et vous obtenez également l'avantage que le récepteur de la délégation n'a pas besoin de s'étendre NSView ou NSObject
Pouvez-vous utiliser le passé dans la couche de paramètres de construction d'une instruction de commutation de sorte que vous pouvez tout mettre dans cette méthode, contre l'avis de l'documents):
Juste mes 2 cents.