112 votes

CALayers n'a pas été redimensionné lors de la modification des limites de UIView. Pourquoi?

J'ai un UIView qui a environ 8 sous-couches CALayer ajoutées à sa couche. Si je modifie les limites de la vue (animée), la vue elle-même sera réduite (je l'ai vérifiée avec un backgroundColor ), mais la taille des sous-couches reste inchangée .

Comment résoudre ceci?

162voto

Chadwick Wood Points 506

J'ai utilisé la même approche que Solin, mais il y a une faute de frappe dans ce code. La méthode devrait être:

 - (void)layoutSubviews {
  // resize your layers based on the view's new bounds
  mylayer.frame = self.bounds;
}
 

Pour mes besoins, j'ai toujours souhaité que la sous-couche ait la taille de la vue parent. Mettez cette méthode dans votre classe de vue.

27voto

Ole Begemann Points 85798

Étant donné que CALayer sur l'iPhone ne prend pas en charge les gestionnaires de disposition, je pense que vous devez transformer le calque principal de votre vue en une sous-classe CALayer personnalisée dans laquelle vous substituez layoutSublayers pour définir les cadres de toutes les sous-couches. Vous devez également remplacer la méthode +layerClass votre vue pour renvoyer la classe de votre nouvelle sous-classe CALayer.

9voto

Solin Points 581

J'ai eu le même problème. Dans la couche d'une vue personnalisée, j'ai ajouté deux sous-couches supplémentaires. Afin de redimensionner les sous-couches (chaque fois que les limites de la vue personnalisée changent), j'ai implémenté la méthode layoutSubviews de ma vue personnalisée; Dans cette méthode, je viens de mettre à jour le cadre de chaque sous-couche afin qu'il corresponde aux limites actuelles du calque de ma sous-vue.

Quelque chose comme ça:

 -(void)layoutSubviews{
   //keep the same origin, just update the width and height
   if(sublayer1!=nil){
      sublayer1.frame = self.layer.bounds;
   }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X