Texto Grande Que Se Corta en UITextView Que está Dentro De UIScrollView


Estoy teniendo un problema serio que no puedo arreglar y me está volviendo loco durante los últimos dos días. He buscado a lo largo y ancho y no puedo encontrar una solución, a pesar de que he intentado muchos.

Tengo un UITextView dentro de un UIScrollView. Puedo cambiar dinámicamente el tamaño de UITextView dentro de scrollview para mostrar el texto. Pero cuando el UITextView contiene texto muy grande se corta cuando me desplazo casi hasta el final. Sin embargo, el marco de UIScrollView todavía está siendo dimensionado correctamente.

He leído estos mensajes: esto este y muchos similares.

El UIScrollview y UITextview se crean en el xib usando AutoLayout.

Aquí está mi código actual y una captura de pantalla como puede ver, el punto en blanco en la captura de pantalla debe estar lleno de texto. por favor, ayuda.

introduzca la descripción de la imagen aquí

- (void)viewDidAppear:(BOOL)animated
{
    CGRect frame = self.longDescField.frame;
    frame.size.height = self.longDescField.contentSize.height;
    self.longDescField.frame = frame;

    self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width,  self.longDescField.contentSize.height + 200);
    self.scrollView.scrollEnabled = YES;
    [self.scrollView flashScrollIndicators];
}
Author: Community, 2013-09-09

16 answers

Este problema ha existido desde iOS 7 y todavía está presente en iOS 11.

Sin embargo, no pude mantener el comportamiento de desplazamiento normal configurando scrollEnabled = NO antes del cambio de tamaño, como recomendó @igz. En su lugar, cambié el desplazamiento on y off después del cambio de tamaño

// Resize text view here

textView.scrollEnabled = NO;
textView.scrollEnabled = YES;

Esto obligó al texto cortado a renderizarse correctamente.

 127
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-29 07:31:30

Gracias a todos por su ayuda. Esto es en última instancia lo que terminó funcionando para mí en iOS7.

Tuve que deshabilitar el diseño automático para este xib en particular.

Luego hizo lo siguiente:

[textView setScrollEnabled:YES];
[textView setText:text];
[textView sizeToFit];
[textView setScrollEnabled:NO];
 14
Author: sudo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-22 00:48:47

Para mí la solución era poner sizeToFit después de personalizar el TextView

[self.yourTextView sizeToFit];

Esto debe ser lo último que haga al manipular textview, no debe ser antes de rellenar el texto de contenido.

 10
Author: meda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 21:54:32

Definitivamente iOS7. Tuve este mismo problema aplicándose a todas las UITextViews que fueron redimensionadas, tanto xib como código generado. Encontré el contenedor de texto.tamaño necesario ajustar después de UITextView marco fue cambiado.

He creado este código de categoría para ajustar el textContainer.tamaño, pero también parece que necesita ajuste después de establecer el valor del texto, así que tengo que llamar a adjustAfterFrameChange después de cualquier cambio de texto si no son seguidos por el establecimiento del tamaño del marco. Este código hace que el suposición de que UITextView no está haciendo nada con setFrame: por lo tanto, saque setFrame: y llame a adjustAfterFrameChange manualmente si desea evitar ese riesgo

Editar: cambiado

self.textContainer.size = self.frame.size; // fix for cut off text

A

self.textContainer.size = self.contentSize; // fix for cut off text

@interface UITextView(Extras)

- (void)adjustAfterFrameChange;

@end



@implementation UITextView(Extras)

- (void)adjustAfterFrameChange {
#if defined(__IPHONE_7_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0
    if ([self respondsToSelector:@selector(textContainer)])
        self.textContainer.size = self.contentSize; // fix for cut off text
#endif
}


- (void)setFrame:(CGRect)frame {
    [super setFrame:frame];

    [self adjustAfterFrameChange];
}

@end
 7
Author: K1w1Geek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-26 20:07:22

Prueba esto

[self.textView setContentInset:UIEdgeInsetsMake(-8.0, 0, -8.0, 0)];

Funciona para la visualización de texto cortado en el UITextView.

 5
Author: zedzhao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-20 16:44:45

Tuve un problema similar, en el que el texto largo se cortaba después de un cambio de tamaño de la vista de texto. Desactivar scrollingEnabled antes de que el cambio de tamaño parecía solucionarlo. Seguro que parece un error de IOS 7.

 4
Author: igz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-23 18:59:23

Solo prueba esto.

En IOS 8 y Xcode 6.3,

textview.scrollEnabled=YES;
[self.textview setContentInset:UIEdgeInsetsMake(-10.0, 0, -5.0, 0)];
 2
Author: Rana Raza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-01 02:51:43

Este problema se puede solucionar estableciendo la propiedad layout contigua en false.

textView.layoutManager.allowsNonContiguousLayout = false

Aunque la documentación dice que el valor predeterminado es false, en realidad se establece en true para un UITextView.

 2
Author: ArunGJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-03 21:20:42

Tuvimos un problema como este con la implementación de iOS7. Cuando llamamos a setText que agregó una nueva línea (o líneas) a nuestro UITextView, el textview no estaba usando la nueva altura correcta para su redibujado. El setNeedsDisplay, setNeedsLayout, redibujar capas, redibujar toda la vista, etc. todo no funcionó. Finalmente forzamos una pérdida y ganancia de enfoque:

[textView resignFirstResponder];
[textView becomeFirstResponder];

Esto forzó el recálculo de altura y el redibujado correcto. Afortunadamente, no hace que el teclado salga y entre, pero es vale la pena probar la regresión en cualquier versión de iOS compatible con su aplicación.

 1
Author: Kelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-11 18:44:42

Esto sucede todo el camino, desde el Creador de Interfaces también.

Cuando se selecciona vista de texto, en el Inspector de Utilidades desmarque la opción Muestra Indicador Vertical. El texto recortado aparece ahora.

 1
Author: SyntheticMeshwork,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-08 17:11:41

Teníamos el mismo problema, excepto que la mitad izquierda o la mitad derecha del UITextView se estaba cortando. Sucedió en iOS 7 y iOS 6, en una variedad de teléfonos. Llamando:

myTextView.scrollEnabled = NO;

In viewWillAppear trabajó alrededor del problema.

 1
Author: jlegakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-30 22:34:55

Tengo el mismo problema para un textview (sin un scrollview). Solucionado esto (Xcode 7.3.1, iOS 9.3) con solo desmarcar "Scrolling Enabled" en el Inspector de Atributos.

 1
Author: Francesco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-25 13:17:10

Puedo estar equivocado, pero no entiendo su problema a fondo, pero ¿cuál es el uso de un UIScrollView ya que con la clase UITextView implementa el comportamiento para una región de texto de varias líneas desplazable ?

Debe descartar UIScrollView.

 0
Author: LudoZik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-09 11:49:08

Ninguna de estas respuestas funcionó para mí.

Estaba jugando con el guion gráfico y de alguna manera está funcionando ahora. Todavía se ve mal en el guion gráfico, pero en el dispositivo ahora se muestra bien.

Hice varias cosas, incluyendo cambiar muchas de las opciones para el campo de texto.

Yo creo que lo que lo arregló para mí fue haciendo la vista más grande, construyendo, y haciéndola del tamaño correcto de nuevo.

Mis disculpas por una respuesta vaga e incierta, pero tal vez ayude. Este proyecto fue escrito originalmente para iOS 5, y es posible que la vista de texto no se haya mezclado mucho desde entonces.

 0
Author: csga5000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-04 00:35:03

Estoy enfrentando la misma situación. Tengo que desactivar el desplazamiento de UITextView y hacer eso hace que la última línea sea recortada. Aquí está mi solución:

//In the  UITextView subClass, override "gestureRecognizerShouldBegin" and let the scrolling of UITextView remain on.

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && gestureRecognizer.view == self){
        return NO;
    }
    return [super gestureRecognizerShouldBegin:gestureRecognizer];
}
 0
Author: Jagie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-09 05:45:24

En Swift solucioné este problema simplemente configurando el textContainerInset de mi UITextView:

textView.textContainerInset = UIEdgeInsets(top: 0.0, left: 0.0,
                                           bottom: 50.0, right: 0.0)
 0
Author: NoodleOfDeath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-17 19:37:41