Existe-t-il un bon moyen d'ajuster la taille d'un UITextView
pour l'adapter à son contenu? Disons par exemple que j'ai un UITextView
qui contient une ligne de texte:
"Hello world"
J'ajoute ensuite une autre ligne de texte:
"Goodbye world"
Existe-t-il un bon moyen dans Cocoa Touch pour obtenir le rect
contenu de toutes les lignes de la vue texte afin de pouvoir ajuster la vue parent en conséquence?
Comme autre exemple, regardez le champ des notes pour les événements dans l'application Calendrier - notez comment la cellule (et celle UITextView
qu'elle contient) se développe pour contenir toutes les lignes de texte dans la chaîne des notes.
Réponses:
Cela fonctionne pour iOS 6.1 et iOS 7:
Ou dans Swift (fonctionne avec Swift 4.1 dans iOS 11)
Si vous souhaitez prendre en charge iOS 6.1, vous devez également:
la source
textview.scrollEnabled = NO;
pour éviter que le texte ne soit coupé même dans iOS 7.CGFLOAT_MAX
macro au lieu deMAXFLOAT
. Adapté aux deux plates-formes 32/64 bits.Cela ne fonctionne plus sur iOS 7 ou supérieur
Il existe en fait un moyen très simple de redimensionner le
UITextView
à sa hauteur correcte du contenu. Cela peut être fait en utilisant leUITextView
contentSize
.Une chose à noter est que le bon
contentSize
est uniquement disponible après l'UITextView
a été ajouté à la vue avecaddSubview
. Avant cela, il est égal àframe.size
Cela ne fonctionnera pas si la disposition automatique est activée. Avec la disposition automatique, l'approche générale consiste à utiliser la
sizeThatFits
méthode et à mettre à jour laconstant
valeur sur une contrainte de hauteur.heightConstraint
est une contrainte de disposition que vous configurez généralement via un IBOutlet en liant la propriété à la contrainte de hauteur créée dans un storyboard.Pour ajouter à cette étonnante réponse, 2014, si vous:
il y a une différence de comportement avec l' iPhone6 + uniquement:
Avec le 6+ seulement (pas le 5s ou le 6), il ajoute "une ligne vierge de plus" à l'UITextView. La "solution RL" corrige parfaitement cela:
Il corrige le problème de "ligne supplémentaire" sur 6+.
la source
layoutIfNeeded
sur la vue d'ensemble. Ensuite, vous pouvez saisir la hauteurcontentSize
.Pour faire un dimensionnement dynamique à l'
UITextView
intérieur d'unUITableViewCell
, j'ai trouvé que la combinaison suivante fonctionne dans Xcode 6 avec le SDK iOS 8:UITextView
à unUITableViewCell
et le contraindre sur les côtésUITextView
de »scrollEnabled
propriété àNO
. Avec le défilement activé, le cadre duUITextView
est indépendant de la taille de son contenu, mais avec le défilement désactivé, il existe une relation entre les deux.Si votre table utilise la hauteur de ligne par défaut d'origine de 44, il calculera automatiquement les hauteurs de ligne, mais si vous avez changé la hauteur de ligne par défaut pour autre chose, vous devrez peut-être activer manuellement le calcul automatique des hauteurs de ligne dans
viewDidLoad
:Pour le dimensionnement dynamique en lecture seule
UITextView
, c'est tout. Si vous autorisez les utilisateurs à modifier le texte dans votreUITextView
, vous devez également:Implémentez la
textViewDidChange:
méthode duUITextViewDelegate
protocole et dites à latableView
de se repeindre à chaque fois que le texte est édité:Et n'oubliez pas de placer le
UITextView
délégué quelque part, dansStoryboard
ou entableView:cellForRowAtIndexPath:
la source
tableView.rowHeight = UITableViewAutomaticDimension
c'était inutile.Solution de travail très simple utilisant à la fois du code et un storyboard.
Par code
Par Storyboard
Décochez la case Activer le défilement
Pas besoin de faire quoi que ce soit d'autre.
la source
Rapide :
la source
textView.scrollEnabled = false
Dans mon expérience (limitée),
ne respecte pas les caractères de nouvelle ligne, vous pouvez donc vous retrouver avec beaucoup plus court
CGSize
que ce qui est réellement requis.semble respecter les nouvelles lignes.
De plus, le texte n'est pas réellement affiché en haut de la
UITextView
. Dans mon code, j'ai défini la nouvelle hauteur de laUITextView
pour être 24 pixels plus grande que la hauteur renvoyée par lessizeOfFont
méthodes.la source
Dans iOS6, vous pouvez vérifier la
contentSize
propriété d'UITextView juste après avoir défini le texte. Dans iOS7, cela ne fonctionnera plus. Si vous souhaitez restaurer ce comportement pour iOS7, placez le code suivant dans une sous-classe de UITextView.la source
Je posterai la bonne solution au bas de la page au cas où quelqu'un serait courageux (ou assez désespéré) pour lire jusqu'à ce point.
Voici le dépôt gitHub pour ceux qui ne veulent pas lire tout ce texte: resizableTextView
Cela fonctionne avec iOs7 (et je pense que cela fonctionnera avec iOs8) et avec la mise en page automatique. Vous n'avez pas besoin de nombres magiques, désactivez la mise en page et des trucs comme ça. Solution courte et élégante.
Je pense que tout le code lié aux contraintes devrait aller à la
updateConstraints
méthode. Alors, faisons le nôtreResizableTextView
.Le premier problème que nous rencontrons ici est que nous ne connaissons pas la taille réelle du contenu avant la
viewDidLoad
méthode. Nous pouvons prendre une route longue et boguée et la calculer en fonction de la taille de la police, des sauts de ligne, etc. Mais nous avons besoin d'une solution robuste, nous allons donc faire:CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Alors maintenant, nous connaissons le vrai contenu, quelle que soit notre position: avant ou après
viewDidLoad
. Ajoutez maintenant une contrainte de hauteur sur textView (via le storyboard ou le code, peu importe comment). Nous ajusterons cette valeur avec notrecontentSize.height
:La dernière chose à faire est de dire à la superclasse
updateConstraints
.Maintenant, notre classe ressemble à:
ResizableTextView.m
Joli et propre, non? Et vous n'avez pas à traiter avec ce code dans votre contrôleurs !
Mais attendez! OU PAS D'ANIMATION!
Vous pouvez facilement animer les modifications pour effectuer un
textView
étirement en douceur. Voici un exemple:la source
CGFLOAT_MAX
pasFLT_MAX
.As-tu essayé
[textView sizeThatFits:textView.bounds]
?Edit: sizeThatFits renvoie la taille mais ne redimensionne pas réellement le composant. Je ne sais pas si c'est ce que vous voulez, ou si
[textView sizeToFit]
c'est plus ce que vous cherchiez. Dans les deux cas, je ne sais pas si cela s'adaptera parfaitement au contenu comme vous le souhaitez, mais c'est la première chose à essayer.la source
Une autre méthode consiste à trouver la taille qu'une chaîne particulière prendra en utilisant la
NSString
méthode:-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
Cela renvoie la taille du rectangle qui correspond à la chaîne donnée avec la police donnée. Passez une taille avec la largeur souhaitée et une hauteur maximale, puis vous pouvez regarder la hauteur retournée pour s'adapter au texte. Il existe une version qui vous permet également de spécifier le mode de saut de ligne.
Vous pouvez ensuite utiliser la taille renvoyée pour modifier la taille de votre vue pour l'adapter.
la source
Si vous ne disposez pas de l'
UITextView
outil pratique (par exemple, vous dimensionnez des cellules de vue de tableau), vous devrez calculer la taille en mesurant la chaîne, puis en tenant compte des 8 pt de rembourrage de chaque côté de aUITextView
. Par exemple, si vous connaissez la largeur souhaitée de votre affichage de texte et que vous souhaitez déterminer la hauteur correspondante:Ici, chaque 8 représente l'un des quatre bords rembourrés, et 100000 sert simplement de très grande taille maximale.
En pratique, vous voudrez peut-être ajouter un supplément
font.leading
à la hauteur; cela ajoute une ligne vierge en dessous de votre texte, ce qui peut sembler mieux s'il y a des contrôles visuellement lourds directement sous la vue du texte.la source
On peut le faire par contraintes.
2.Créez IBOutlet pour cette contrainte de hauteur.
3. n'oubliez pas de définir délégué pour votre affichage de texte.
4.
puis mettez à jour votre contrainte comme ceci :)
la source
Les choses suivantes suffisent:
UITextView
:Vous pouvez même utiliser
UITableViewAutomaticDimension
.la source
Combiné avec la réponse de Mike McMaster, vous voudrez peut-être faire quelque chose comme:
la source
J'ai trouvé un moyen de redimensionner la hauteur d'un champ de texte en fonction du texte qu'il contient et d'organiser également une étiquette en dessous en fonction de la hauteur du champ de texte! Voici le code.
la source
Les gars utilisant la mise en page automatique et votre taille ne fonctionnent pas, alors vérifiez une fois votre contrainte de largeur. Si vous avez manqué la contrainte de largeur, la hauteur sera précise.
Pas besoin d'utiliser une autre API. une seule ligne réglerait tout le problème.
Ici, je ne me préoccupais que de la hauteur, en gardant la largeur fixe et j'avais manqué la contrainte de largeur de mon TextView dans le storyboard.
Et c'était pour montrer le contenu dynamique des services.
J'espère que cela pourrait aider ..
la source
À partir d'iOS 8, il est possible d'utiliser les fonctionnalités de mise en page automatique d'un UITableView pour redimensionner automatiquement un UITextView sans aucun code personnalisé. J'ai mis un projet dans github qui le démontre en action, mais voici la clé:
rowHeight
surUITableViewAutomaticDimension
.la source
J'ai passé en revue toutes les réponses et toutes gardent une largeur fixe et ajustent uniquement la hauteur. Si vous souhaitez régler également la largeur, vous pouvez très facilement utiliser cette méthode:
donc lors de la configuration de votre affichage texte, désactivez le défilement
puis dans la méthode déléguée,
func textViewDidChange(_ textView: UITextView)
ajoutez ce code:Les sorties:
la source
Cela a bien fonctionné lorsque j'ai eu besoin de faire du texte dans une
UITextView
zone spécifique:la source
voici la version rapide de @jhibberd
la source
désactiver le défilement
ajouter des contraintes
et ajoutez votre texte
si vous utilisez,
UIScrollView
vous devez également l'ajouter;la source
Pour iOS 7.0, au lieu de définir
frame.size.height
l'utilisationcontentSize.height
(qui ne fait actuellement rien)[textView sizeToFit]
.Voir cette question .
la source
L'utilisation de UITextViewDelegate est le moyen le plus simple:
la source
J'espère que cela t'aides:
la source
textView.frame
.si d'autres arrivent ici, cette solution fonctionne pour moi, 1 "Ronnie Liew" +4 "user63934" (mon texte arrive du service web): notez le 1000 (rien ne peut être si gros "dans mon cas")
Et c'est ... Vive
la source
Le meilleur moyen que j'ai découvert pour redimensionner la hauteur de l'UITextView en fonction de la taille du texte.
ou vous pouvez UTILISER
la source
Pour ceux qui veulent que la vue texte se déplace vers le haut et maintienne la position de la ligne de fond
la source
Le seul code qui fonctionnera est celui qui utilise 'SizeToFit' comme dans la réponse jhibberd ci-dessus, mais en réalité il ne reprendra que si vous l'appelez dans ViewDidAppear ou le câblez à l'événement de modification de texte UITextView.
la source
Sur la base de la réponse de Nikita Took, je suis arrivé à la solution suivante dans Swift qui fonctionne sur iOS 8 avec la mise en page automatique:
la source
Réponse rapide: le code suivant calcule la hauteur de votre textView.
Vous pouvez maintenant définir la hauteur de votre texte
myTextHeight
la source
let attribute = [NSFontAttributeName: textView.text.font!]
est-ce vraiment du code Swift sans erreurs?) Vouliez-vous direlet attribute = [NSFontAttributeName: textView.font!]