ios - Obtenga altura dinámica de UITextView con diseño automático después de configurar el texto
objective-c autolayout (11)
Si prefiere hacerlo todo por diseño automático:
En el Inspector de Tamaño:
Establezca la prioridad de resistencia a la compresión de contenido vertical en 1000.
Disminuya la prioridad de la altura de restricción para su UITextView. Solo hazlo menos de 1000.
En Attributes Inspector:
- Desmarque Desplazamiento habilitado .
Tengo una UITextView no desplazable con diseño automático establecido por el constructor de interfaz, y el texto aumenta o disminuye dinámicamente sin problema, pero quiero saber cuál es la nueva altura de UITextView después de configurar el texto, estoy intentando hacer esto:
NSLog(@"text before: %.2f",self.myText.frame.size.height);
[self.myText setText:self.string];
NSLog(@"text after: %.2f",self.myText.frame.size.height);
este es el resultado:
text before: 47.50
text after: 47.50
el texto se incrementa en la vista cuando lo ejecuto, pero el tamaño es el mismo, ¿cómo puedo obtener la altura real después de configurar el texto?
Esto debería funcionar:
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);
Aquí hay una implementación de ejemplo en mi Github: https://github.com/guillaume-algis/SO-27060338
- (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;
}
A diferencia de UILabel, UITextView no tiene una propiedad de tamaño intrínseco. Entonces, cómo lo hice fue configurar la restricción de altura de UITextView
, engancharla mediante IBOutlet y cambiar su valor en textViewDidChange
o cuando cambia el texto.
@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
}
}
He utilizado el código proporcionado en el siguiente enlace AutoLayout con altura de UITextView dinámica y funcionó para mí :)
seleccione vista de texto y desmarque "Desplazamiento habilitado"
seleccione vista de texto desde el menú superior "Editor> tamaño para ajustar el contenido"
seleccione la vista debajo de ella, establezca sus restricciones superiores con la parte inferior de la vista de texto al margen que desee, luego vaya a "Inspector de tamaño", haga doble clic o edite la restricción que acaba de agregar, y establezca la "Relación" en "Mayor que o igual "
Otro enfoque más es usar
myTextView.textContainer.heightTracksTextView = true
Lo cual permite que el desplazamiento esté habilitado
Swift 3.0
textView.isScrollEnabled = false
Esto permite que AutoLayout haga su trabajo.
Use el siguiente código:
Código Objective-C
[textView setScrollEnabled:NO];
código SWIFT
textView.isScrollEnabled = false
Justo después de cambiar la llamada de texto
[self.myText sizeToFit];
Todo lo que tiene que hacer es configurar todas sus restricciones, excepto la altura Y, configurar textView
''s scrollEnabled
a NO
. La última parte es qué hace el truco. Su vista de texto se dimensionará automáticamente dependiendo de su valor de texto.