J'ai un UIView
qui a environ 8 CALayer
sous-couches différentes ajoutées à sa couche. Si je modifie les limites de la vue (animées), la vue elle-même se rétrécit (je l'ai vérifiée avec a backgroundColor
), mais la taille des sous-couches reste inchangée .
Comment résoudre ça?
UITextView
(scrollEnabled = NO) et une mise en page automatique. J'avais une vue de texte épinglée à sa super-vue, qui à son tour avait unCALayer
en bas d'elle-même (une bordure), et je voulais qu'elle mette à jour la position de la bordure lorsque la hauteur de la vue du texte changeait. Pour une raison quelconque, il alayoutSubiews
été appelé beaucoup trop tard (et la position du calque était animée).Puisque CALayer sur l'iPhone ne prend pas en charge les gestionnaires de mise en page, je pense que vous devez faire de la couche principale de votre vue une sous-classe CALayer personnalisée dans laquelle vous remplacez
layoutSublayers
pour définir les cadres de toutes les sous-couches. Vous devez également remplacer la+layerClass
méthode de votre vue pour renvoyer la classe de votre nouvelle sous-classe CALayer.la source
J'ai utilisé ceci dans l'UIView.
Travaille pour moi.
la source
CALayerDelegate
s »draw(_:in:)
), je devais appeler aussi_anySubLayer.setNeedsDisplay()
. Ensuite, cela a fonctionné pour moi.J'ai eu le même problème. Dans la couche d'une vue personnalisée, j'ai ajouté deux autres sous-couches. 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 mets simplement à jour l'image de chaque sous-couche pour qu'elle corresponde aux limites actuelles de la couche de ma sous-vue.Quelque chose comme ça:
la source
2017
La réponse littérale à cette question:
"CALayers n'a pas été redimensionné sur les limites de son UIView. Pourquoi?"
est-ce pour le meilleur ou pour le pire
needsDisplayOnBoundsChange
la valeur par défaut est false dans
CALayer
.Solution,
En effet, je vous dirige vers ce QA
https://stackoverflow.com/a/47760444/294884
ce qui explique ce que fait le
contentsScale
cadre critique ; vous devez généralement définir cela de la même manière lorsque vous définissez needsDisplayOnBoundsChange.la source
Version Swift 3
Dans la cellule personnalisée, ajoutez les lignes suivantes
Déclarer en premier
Puis ajoutez les lignes suivantes
la source
Comme [Ole] l'a écrit, CALayer ne prend pas en charge le redimensionnement automatique sur iOS. Vous devez donc ajuster la mise en page manuellement. Mon option était d'ajuster le cadre du calque dans (iOS 7 et versions antérieures)
ou (à partir d'iOS 8)
la source
Dans votre vue personnalisée, vous devez déclarer une variable pour votre couche personnalisée, ne déclarez pas de variable dans la portée init. Et lancez-le simplement une fois, n'essayez pas de définir une valeur nulle et de réinitialiser
la source