1
votes

Comment puis-je définir la hauteur d'un UITextView pour correspondre exactement à son contenu tronqué?

J'ai un UITextView dont je voudrais limiter la hauteur à une valeur raisonnable, avec le texte tronqué si nécessaire. Comment puis-je m'assurer que la hauteur de la vue de texte correspond à celle du contenu tronqué ? Si, par exemple, je règle la hauteur sur une valeur fixe, il y aura un espace variable en bas de la vue de texte qui affectera la disposition des éléments en dessous.

Existe-t-il un moyen de définir la hauteur souhaitée, de mesurer le texte tronqué, puis d'utiliser cette mesure pour ajuster plus précisément la hauteur? Existe-t-il même un moyen de mesurer la hauteur du texte affiché dans UITextView ?

< gagnantModifier

Je dois clarifier:

  1. Je n'ai pas besoin d'aide pour tronquer le texte. Comme vous pouvez le voir sur la capture d'écran, le texte est déjà tronqué.
  2. Je ne peux pas mesurer le texte car j'aurais besoin de mesurer le texte tronqué , auquel je n'ai pas accès.
  3. L'espace en bas de la vue texte n'est pas lié à textcontainerInset .

Voici comment la capture d'écran est actuellement construite:

  1. Le texte est défini sur une longue chaîne.
  2. La vue texte est artificiellement contrainte à une certaine hauteur, disons 300 . Cela produit la troncature.
  3. Comme 300 n'est pas un multiple précis de la hauteur de ligne, il y a un espace supplémentaire sous la dernière ligne tronquée.

Ce que je voudrais faire:

Après avoir dimensionné la vue de texte à 300 , mesurez la hauteur précise du texte tronqué afin que je puisse redimensionner la vue de texte une deuxième fois pour l'adapter sans le un espacement supplémentaire (par exemple, définissez-le sur 285 si c'est la taille mesurée).

Ou, une autre méthode pour obtenir le même résultat final.


1 commentaires

Si vous avez vraiment besoin d’aide, pourquoi ne pas publier un projet téléchargeable qui montre exactement ce que vous faites?


3 Réponses :


0
votes

Je pense qu'il est tronqué à cause de vos contraintes. Vous devez donc calculer la taille du texte dans le code et mettre à jour la valeur de la contrainte:

textView.textContainerInset = .zero

Le résultat de cette opération est float et n'est pas lié aux pixels. Lorsque la taille de la vue est calculée par les contraintes, elle est arrondie en pixels (0,5 ou 0,333 ...), c'est pourquoi nous devons l'arrondir nous-mêmes pour exclure les cas imprévisibles. Pour obtenir une hauteur de pixel parfaite, vous pouvez l'arrondir en fonction de l'échelle de l'écran:

textViewHeightConstraint.constant = (boundingRect.height * UIScreen.main.nativeScale).rounded(.up) / UIScreen.main.nativeScale

De plus, comme @nghiahoang mentionné ci-dessous, n'oubliez pas de remettre à zéro les inserts

XXX

Veuillez consulter un exemple de projet: https://github.com/PhilipDukhov / TruncatedTestViewTest


12 commentaires

Je veux qu'il soit tronqué. Je souhaite dimensionner la vue texte pour qu'elle corresponde exactement à la hauteur tronquée.


@BenPackard bien sûr, vous spécifiez simplement la largeur et la hauteur maximales dans maxSize, et elles seront tronquées


Oui, mais ma question n'est pas «Comment puis-je tronquer le texte» (qui est déjà présent dans ma capture d'écran). C'est comment redimensionner la vue du texte pour qu'elle corresponde à ce texte tronqué - en d'autres termes, en supprimant le sont marqués en rouge.


@BenPackard comment le tronquer? L'implémentation par défaut ne le fait pas, donc un exemple de code sera utile. Fondamentalement, le code que j'ai ajouté en tant que réponse calculera la taille de votre texte.


Une vue de texte est tronquée en désactivant le défilement. Après cela, c'est automatique, tant que le texte est plus grand que la vue. Le problème est de savoir comment connaître la taille physique de ce texte une fois qu'il a été tronqué, puisque la vue texte en est responsable, pas moi. Par conséquent, je n'ai pas de chaîne tronquée à mesurer.


@BenPackard J'ai ajouté une modification pour prendre en charge le calcul de la taille du texte multiligne, ainsi qu'un exemple de projet


Je ne pense pas que mes questions soient suffisamment claires car cela ne répond pas vraiment. Je vais ajouter une modification.


@BenPackard dans mon exemple de projet, c'est exactement la même chose. J'ai une contrainte qui limite la largeur, donc j'utilise la largeur de textView comme largeur maximale, et j'utilise une constante comme hauteur maximale, pour calculer la taille du texte et mettre à jour les contraintes de hauteur. Si votre cas n'est pas le même, veuillez créer une demande d'extraction vers mon exemple de projet afin que je puisse le vérifier


Augmentez simplement la taille de votre police jusqu'à 20 et exécutez sur le simulateur iPhone SE. Vous verrez le même problème - imgur.com/cdwKAYp


@BenPackard mon mauvais, j'oublie d'arrondir la valeur. J'ai mis à jour la réponse avec plus d'informations


Mais vous mesurez toujours la taille du texte entier, pas le texte tronqué. Votre exemple de projet est-il mis à jour? Si c'est le cas, je peux réessayer si vous le souhaitez.


@BenPackard oui, c'est mis à jour, vérifiez-le. En limitant la taille du rectangle englobant, nous obtenons le même résultat que le textView lorsqu'il le tronque



0
votes

Compilez la solution de Philip et définissez inset.bottom sur 0

textView.textContainerInset.bottom = 0


0 commentaires

-1
votes

Directement, ce n'est pas possible. Si vous voulez le faire, vous devez prendre UILabel derrière UITextView . Parce que UILabel a la propriété d'étendre automatiquement la hauteur et la largeur en fonction du texte. À présent. définir des contraintes égales de UILabel à UItextview . quelles devraient être les contraintes, laissez-moi explorer étape par étape:

  1. définir le début et la fin de UILabel .
  2. Correction des principales contraintes de uILabel .
  3. vous n'avez pas besoin de définir une contrainte de hauteur, mais si vous le souhaitez, vous pouvez définir une contrainte supérieure à égale à la contrainte de la constante 20 ou 30.
  4. Définissez maintenant les contraintes de début, de fin, de haut et de hauteur de UITextview égales à UILabel.

Maintenant, quel que soit le texte que vous définissez dans UIlabel , donnez-le également à label. Je ne l'ai pas fait dans le passé. Si vous rencontrez un problème, veuillez le demander en commentaire


1 commentaires

Si vous ne définissez pas de contrainte de hauteur sur l'étiquette, comment tronquera-t-elle le texte?