iPhone UIView - Cadre de Redimensionnement pour s'Adapter à des sous-vues
Ne devrait pas y avoir un moyen de redimensionner le cadre d'une UIView après que vous avez ajouté des sous-vues, de sorte que le cadre soit de la taille nécessaire pour inclure tous les sous-vues? Si votre sous-vues sont ajoutés dynamiquement comment pouvez-vous déterminer quelle est la taille de l'image du conteneur doit être? Cela ne fonctionne pas:
[myView sizeToFit];
Vous devez vous connecter pour publier un commentaire.
Découvrez La difficulté à obtenir les UIView sizeToFit à faire quelque chose de valable
L'essentiel est que
sizeToFit
est pour les sous-classes de modifier, et de ne pas faire n'importe quoi dans UIView. Il n'trucs pourUILabel
, car il remplacesizeThatFits:
qui est appelé parsizeToFit
Vous pouvez également ajouter le code suivant pour calculer la position des sous-vues.
UIViewUtils.h
UIViewUtils.m
tmpFrame = CGRectUnion(tmpFrame, v.frame)
où tmpFrame sera déclaré juste avant le forloop comme CGRectZeroJe besoin pour s'adapter à des sous-vues a eu un négatif au point d'origine, et
CGRectUnion
est l'ObjC manière de faire, honnêtement, comme quelqu'un l'a mentionné dans les commentaires. Tout d'abord, voyons comment cela fonctionne:Comme vous pouvez le voir ci-dessous, nous supposons que certains des sous-vues sont situés à l'extérieur, de sorte que nous devons faire deux choses à le rendre bon, sans affecter le positionnement des sous-vues:
Une image vaut mille mots.
Code vaut un milliard de mots. Voici la solution:
J'ai pensé qu'il serait amusant d'écrire dans Swift 2.0 .. j'avais raison!
Et l'aire de jeux, la preuve:
Avis de la
visualAidView
ne bouge pas, et vous aide à voir comment lesuperview
redimensionne tout en conservant les positions de la sous-vues.Il ressemble Kenny 's réponse points ci-dessus à la bonne solution dans le référencé question, mais peuvent avoir enlevé le mauvais concept. Le
UIView
de la classe de référence certainement suggère un système de mise àsizeToFit
pertinents pour vos affichages personnalisés.Remplacer
sizeThatFits
, passizeToFit
Personnalisé de votre
UIView
s doit remplacersizeThatFits
de retour ", une nouvelle de taille qui s'adapte le récepteur de sous-vues", cependant, vous souhaitez calculer. Vous pourriez même utiliser les mathématiques de une autre réponse pour déterminer votre nouvelle taille (mais sans recréer de l'intégré danssizeToFit
système).Après
sizeThatFits
retourne les numéros pertinents à son état, les appels àsizeToFit
sur votre vues personnalisées ne causent des attendus de la redimensionne.Comment
sizeThatFits
oeuvresSans un remplacement,
sizeThatFits
retourne simplement l'passée en paramètre de taille (par défautself.bounds.size
pour les appels à partir desizeToFit
. Alors que je n'ai qu'un couple sources sur la question, il apparaît que la taille transmis ne doit pas être considérée comme une stricte de la demande.Mise à jour @Mazyod la réponse de Swift 3.0, a fonctionné comme un charme!
Une vieille question, mais vous pourriez aussi le faire avec une fonction récursive.
Vous pourriez vouloir une solution qui fonctionne toujours, peu importe combien de sous-vues et subsubviews,...
Mise à jour : Ce morceau de code n'avait qu'une fonction get, maintenant aussi un setter.
UIView
etCALayer
. Si c'est pourUIView
sous-types, il suffit d'utiliser une extension classique sans protocoles.Quel module ajouter dynamiquement l'ensemble de ces sous-vues devait savoir où les mettre (de sorte qu'ils se rapportent correctement, ou alors ils ne se chevauchent pas, etc.) Une fois que vous savez que, plus la taille de l'affichage en cours, ainsi que la taille de la sous-vue, vous avez tout ce que vous devez déterminer si l'affichage de la vue doit être modifié.
Ici est une swift version de la accepté de répondre, aussi petit changement, au lieu de l'étendre cette méthode permet d'obtenir le point de vue de la variable et le renvoie.
Heres l'extension de version:
Lorsque vous faites votre propre classe UIView, considèrent primordial IntrinsicContentSize dans la sous-classe. Cette propriété est appelée par le système d'exploitation de connaître la taille recommandée de votre point de vue. Je vais mettre de l'extrait de code pour C# (Xamarin), mais l'idée est la même:
Cette retourné taille dépend complètement de votre conception. Par exemple, si vous venez d'ajouter un label, puis la largeur et la hauteur est seulement la largeur et la hauteur de l'étiquette. Si vous avez plus complexe, vous avez besoin de retourner la taille qui s'adapte à tous vos sous-vues.
Devrait fonctionner, pourquoi ne pas consulter les CGRect avant et après?