web-dev-qa-db-fra.com

Obtenez la hauteur dynamique UITextView avec la mise en page automatique après avoir défini le texte

J'ai une UITextView non défilable avec une mise en page automatique définie par le constructeur d'interface, et le texte augmente ou diminue dynamiquement sans problème, mais je veux savoir quelle est la nouvelle hauteur UITextView après avoir défini le texte, j'essaie de le faire:

NSLog(@"text before: %.2f",self.myText.frame.size.height);
[self.myText setText:self.string];
NSLog(@"text after: %.2f",self.myText.frame.size.height);

voici le résultat:

text before: 47.50
text after: 47.50

le texte est augmenté dans la vue lorsque je l'exécute, mais la taille est la même, comment puis-je obtenir la hauteur réelle après avoir défini le texte?

22
Piero

Cela devrait fonctionner:

NSLog(@"text before: %.2f",self.myText.frame.size.height);
[self.myText setText:self.string];
[self.myText layoutIfNeeded]; // <--- Add this
NSLog(@"text after: %.2f",self.myText.frame.size.height);

Voici un exemple d'implémentation sur mon Github: https://github.com/guillaume-algis/SO-27060338

13
Guillaume Algis

Tout ce que vous avez à faire est de configurer toutes vos contraintes sauf la hauteur ET définissez textView's scrollEnabled sur NO. La dernière partie est ce qui fait l'affaire. Votre affichage de texte sera dimensionné automatiquement en fonction de sa valeur texte.

64
Pavel Gurov

Si vous préférez tout faire par mise en page automatique:

Dans l'inspecteur de taille:

  1. Définissez Priorité à la résistance à la compression du contenu Vertical sur 1000.

  2. Réduisez la priorité de la hauteur de contrainte pour votre UITextView. Faites-en moins de 1000.

enter image description here

Dans l'inspecteur d'attributs:

  1. Décochez Défilement activé .
22
Michael Revlis

J'ai utilisé le code donné sur le lien suivant AutoLayout avec Dynamic UITextView height et cela a fonctionné pour moi :)

13
Parul Garg

Utilisez le code ci-dessous:

Code Objective-C

[textView setScrollEnabled:NO];

Code rapide

textView.isScrollEnabled = false
7
Alok

Swift 3.

textView.isScrollEnabled = false

Cela permet à AutoLayout de faire son travail.

6
Marco Martignone

Juste après avoir changé l'appel texte

[self.myText sizeToFit];
3
merocode

Contrairement à UILabel, UITextView n'a pas de propriété de taille intrinsèque. Donc, comment je l'ai fait a été configuré la contrainte de hauteur de UITextView, le raccorder via IBOutlet et changer sa valeur dans textViewDidChange ou lorsque le texte change.

@IBOutlet weak var textViewHeight: NSLayoutConstraint!

func textViewDidChange(textView: UITextView) {

    // dynamic height adjustments

    var height = ceil(textView.contentSize.height) // ceil to avoid decimal

    if height != textViewHeight.constant { // set when height changed
        textViewHeight.constant = height
        textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes
    }
}
2
Hlung
- (void)textViewDidChange:(UITextView *)textView
{
    UIFont *myFont = [UIFont systemFontOfSize:14];
    CGSize size =   [self sizeOfText:textView.text widthOfTextView:TextviewWidth withFont:myFont];
    NSLog(@"Height : %f", size.height);
}

-(CGSize)sizeOfText:(NSString *)textToMesure widthOfTextView:(CGFloat)width withFont:(UIFont*)font
{
    CGSize ts = [textToMesure sizeWithFont:font constrainedToSize:CGSizeMake(width-20.0, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
    return ts;
}
1
Hardik Kardani

sélectionnez textview et décochez "Scrolling enabled"

sélectionnez textview dans le menu supérieur "Editeur> taille adaptée au contenu"

sélectionnez la vue en dessous, définissez son contraintes supérieures avec le textview bottom à la marge que vous voulez, puis allez dans "Inspecteur de taille", double-cliquez ou modifiez la contrainte que vous venez de ajouté et définissez la "Relation" sur "Supérieur ou égal"

1
zain ullah

Une autre approche consiste à utiliser

myTextView.textContainer.heightTracksTextView = true

Ce qui permet d'activer le défilement

1
Henmyg

Eh bien, je n'ai pas converti ce code en syntaxe Swift4, mais la logique restera la même. Il s'agit d'une méthode d'extension pour Xamarin.ios (C #).

public static nfloat GetEstimateHeight(this UITextView textView, UIView View)
{
    var size = new CoreGraphics.CGSize(View.Frame.Width, height: float.PositiveInfinity);
    var estimatedSize = textView.SizeThatFits(size);
    return estimatedSize.Height;
}

La logique ici qui fonctionnera pour Swift est

var size = new CoreGraphics.CGSize(View.Frame.Width, height: float.PositiveInfinity);
    var estimatedSize = textView.SizeThatFits(size);
    var textViewFinalHeight = estimatedSize.Height;
0
Shanu Singh