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?
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
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.
Si vous préférez tout faire par mise en page automatique:
Dans l'inspecteur de taille:
Définissez Priorité à la résistance à la compression du contenu Vertical sur 1000.
Réduisez la priorité de la hauteur de contrainte pour votre UITextView. Faites-en moins de 1000.
Dans l'inspecteur d'attributs:
J'ai utilisé le code donné sur le lien suivant AutoLayout avec Dynamic UITextView height et cela a fonctionné pour moi :)
Utilisez le code ci-dessous:
Code Objective-C
[textView setScrollEnabled:NO];
Code rapide
textView.isScrollEnabled = false
Swift 3.
textView.isScrollEnabled = false
Cela permet à AutoLayout de faire son travail.
Juste après avoir changé l'appel texte
[self.myText sizeToFit];
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
}
}
- (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;
}
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"
Une autre approche consiste à utiliser
myTextView.textContainer.heightTracksTextView = true
Ce qui permet d'activer le défilement
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;