ios objective-c autolayout uitextview

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:

  1. Establezca la prioridad de resistencia a la compresión de contenido vertical en 1000.

  2. Disminuya la prioridad de la altura de restricción para su UITextView. Solo hazlo menos de 1000.

En Attributes Inspector:

  1. 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 } }



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.