2010-08-17 18 views
2

J'ai des CALayers dans une vue hébergée par couche. Chacune de ces couches a des couches supplémentaires pour contenir (1) un bouton de fermeture et (2) une poignée de redimensionnement. Ces couches de «contrôle» supplémentaires sont ajoutées en tant que sous-couches à la couche parente.Empêcher la mise à l'échelle des sous-couches CALayer

Actuellement, lorsque j'effectue un zoom sur l'espace de travail dans lequel résident ces couches, tout est mis à l'échelle, y compris ces couches de contrôle. Cependant, je voudrais empêcher ces couches de contrôle d'être mises à l'échelle. Existe-t-il un moyen de contourner le comportement d'avoir des transformations d'échelle appliquées à toutes les sous-couches, sans avoir à surcharger la méthode drawInContext: pour chaque couche de contrôle (en supposant que cela est possible)? sans avoir à envoyer manuellement à chacune de ces couches de contrôle un setNeedsDisplay: avec chaque zoom?

J'ai trouvé ce fil qui parle de faire quelque chose de similaire mais la discussion va dans le sens de CATiledLayers ce qui n'est pas ce que je cherche ici.

Redrawing CALayer subclass when super layer is scaled

De plus, ce poste pose une question un peu connexe, mais les réponses ne sont pas applicables à ma situation, car je ne peux pas superposer les contrôles - ils doivent faire partie de la hiérarchie de la couche.

How do I keep a CALayer, sublayer of a CATiledLayer, from changing it's scale after a zoom?

+0

J'ai fini par résoudre ce problème en remplaçant la méthode layoutSublayers de mes CALayers personnalisés, en obtenant la transformée d'échelle cumulée de la hiérarchie de couche, et en appliquant la transformation inverse aux sous-couches de contrôle. – Dalmazio

Répondre

3

Je fini par résoudre ce problème en remplaçant la méthode layoutSublayers de mes CALayers personnalisés, obtenir l'échelle accumulée transformée de la hiérarchie de la couche, et l'application de la transformée inverse aux sous-couches de contrôle.

+0

Avez-vous appelé '[layer setNeedsLayout]' dans la méthode 'scrollViewDidZoom:' delegate de votre contrôleur de vue pour les vues effectuées? – Benjohn

+1

Oui, et non. L'application utilisait AppKit et non UIKit. En tant que tel UIScrollView et UIScrollViewDelegate n'étaient pas disponibles. Mais si vous utilisez UIKit, la façon dont vous suggérez est une façon de le faire. Dans cette application, une vue hébergée par une seule couche héberge une couche de contenu, qui à son tour contient de nombreuses sous-couches. La transformation de zoom/scaling est directement appliquée à la couche de contenu, puis 'setNeedsLayout' est envoyé à toutes les couches d'éléments dans la couche de contenu afin que les contrôles de sous-couche puissent définir leurs transformations inverses pour sembler rester de taille fixe. – Dalmazio