CALayers n'a pas redimensionnée sur son UIView de bornes changement. Pourquoi?
J'ai un UIView
qui a environ 8 différents CALayer
sous-couches ajoutées à sa couche.
Si - je modifier le point de vue de l'limites (animé), puis la vue se rétrécit (je l'ai vérifié avec un backgroundColor
), mais les sous-couches taille reste inchangée.
Comment résoudre ce problème?
Tout releated parties de la documentation? S'il vous plaît, une lumière.
OriginalL'auteur Geri | 2010-03-23
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé la même approche que le Solin utilisé, mais il y a une faute de frappe dans le code. La méthode doit être:
Pour ma part, j'ai toujours voulu que la sous-couche à la taille totale de la vue parent. Mettre cette méthode dans votre classe view.
c'est pas vraiment le cas. Voir la description de la propriété bounds ici: developer.apple.com/library/ios/#documentation/uikit/reference/... -- "Par défaut, l'origine des limites du rectangle (0, 0), mais vous pouvez modifier cette valeur pour afficher différentes parties de la vue."
Merci beaucoup, j'ai appris depuis quelques cas (défilement de l'affichage) lorsque ce n'est pas vrai, mais j'ai oublié de ce commentaire.
N'oubliez pas d'appeler [super layoutSubviews], car cela peut provoquer un comportement inattendu dans divers UIKit classes.
Cela n'a pas fonctionné très bien pour moi avec un auto-dimensionnement
UITextView
(scrollEnabled = NO) et de mise en page automatique. J'ai eu un affichage de texte épinglé à son superview, qui avait à son tour unCALayer
au fond de lui-même (un poste), et je voulais mettre à jour la frontière de position lors de l'affichage de texte en hauteur changé. Pour une raison quelconquelayoutSubiews
a été appelé trop tard (et la position du calque a été animée).OriginalL'auteur Chadwick Wood
Depuis CALayer sur l'iPhone ne prend pas en charge les gestionnaires de mise en page, je pense que vous avez à faire à votre vue principale de la couche personnalisée CALayer sous-classe dans laquelle vous remplacer
layoutSublayers
pour définir les cadres de tous les sous-couches. Vous devez également remplacer votre point de vue est+layerClass
méthode retourne la classe de votre nouveau CALayer sous-classe.CALayer sur le Mac a la disposition des gestionnaires pour cela, mais ils ne sont pas disponibles sur l'iPhone. Donc, oui, vous avez pour calculer les dimensions de l'image vous-même. Une autre option pourrait être d'utiliser des sous-vues à la place de sous-couches. Vous pouvez alors régler les sous-vues' d'un redimensionnement automatique des masques en conséquence.
Ay, UIViews sont trop performance de classes chères, thatswhy-je utiliser CALayers.
J'ai essayé la manière dont vous l'avez suggéré. Il fonctionne, et il n'est pas. Je redimensionner l'affichage de l'animation, mais les sous-couches redimensionne dans une animation différente. Bloody hell, que faire maintenant? Quelle est la méthode pour remplacer la dans la CALayer sous-classe de ce invoque sur TOUS les (!) cadre de l'affichage de l'animation? Est-ce là tout?
Juste tombé sur cette. Semble que la meilleure option est de la sous-classe CALayer comme Ole a dit, mais il semble inutilement lourd.
OriginalL'auteur Ole Begemann
J'ai utilisé ce dans le UIView.
Fonctionne pour moi.
A fonctionné pour moi, mais il a besoin d'un appel par le biais de super
C'est la meilleure réponse! Ouais j'ai essayé layoutSubviews mais il ne rompt mise en page de mon UITextField comme leftView et rightView en train de disparaître et plus de Texte dans UITextField en train de disparaître. J'ai peut-être utilisé pour l'extension à la place de l'héritage de UIView, mais il a été très bogué. CELA FONCTIONNE TRÈS BIEN! THX
OriginalL'auteur Runo Sahara
J'ai eu le même problème. Dans un affichage personnalisé de la couche I ajout de plus de deux sous-couches. Afin de limiter les sous-couches (à chaque fois que l'affichage personnalisé des frontières du changement), j'ai implémenté la méthode
layoutSubviews
de ma vue personnalisée; à l'intérieur de cette méthode, je viens de mettre à jour chaque sous-couche de l'armature de faire correspondre les limites actuelles de mon sous-vue de la couche.Quelque chose comme ceci:
OriginalL'auteur Solin
Swift 3 Version
Dans des cellules Personnalisées, Ajouter les lignes Suivantes
Déclarer première
Puis ajouter les lignes suivantes
OriginalL'auteur Vinay Krishna Gupta
2017
Le littéral réponse à cette question:
"CALayers n'a pas redimensionnée sur son UIView de bornes changement. Pourquoi?"
est que pour le meilleur ou pour le pire
needsDisplayOnBoundsChange
par défaut à false dans
CALayer
.solution,
En effet, je vous orienter vers ce QA
https://stackoverflow.com/a/47760444/294884
ce qui explique, ce que l'enfer de la critique
contentsScale
paramètre n'; vous avez généralement besoin d'fixe également que, lorsque vous définissez needsDisplayOnBoundsChange.OriginalL'auteur Fattie
[Ole] a écrit CALayer ne prend pas en charge d'un redimensionnement automatique sur iOS. Si vous devez ajuster la mise en page manuellement. Mon option était de modifier la couche d'image à l'intérieur d' (iOS 7 et versions antérieures)
ou (iOS 8)
OriginalL'auteur DevGansta