Espacio en blanco en la parte superior de UITextView en iOS 10

116

Tengo UITextView con algo de texto. Todo estaba bien con iOS 6, pero ahora con iOS 7 deja el espacio en blanco en la parte superior y luego coloca el texto debajo de la mitad de la vista de texto.ingrese la descripción de la imagen aquí

No configuré ningún contentOffSet. ¡Por favor ayuda!

Ali Sufyan
fuente

Respuestas:

217

Una vista de texto es una vista de desplazamiento. Los controladores de vista agregarán un desplazamiento de contenido automáticamente para desplazarse por las vistas, ya que se supone que querrán desplazarse hacia arriba detrás de la barra de navegación y la barra de estado.

Para evitar esto, establezca la siguiente propiedad en el controlador de vista que contiene la vista de texto:

self.automaticallyAdjustsScrollViewInsets = NO
jrturton
fuente
7
Esta es una mejor respuesta porque aborda no solo cómo corregir el problema, sino también por qué sucede en primer lugar.
Stephen Melvin
1
Por cierto, no tiene que subclasificar y anular. Simplemente configure automáticamenteAdjustsScrollViewInsets en NO después de crear una instancia de UITextView.
leftspin
1
@leftspin es un caso bastante raro en el que no ha subclasificado un controlador de vista. Y anular el método significa que su código seguirá funcionando en versiones inferiores de iOS; establecer la propiedad significa que primero necesita una verificación de compatibilidad.
jrturton
1
Entonces, si mi controlador de vista de modelo está fuera de UINavigationController, ¿se borraría el desplazamiento? Es un poco loco ... Este comportamiento SOLO es correcto cuando mi vista de texto está alineada en la parte superior, de lo contrario es una basura ... ¿Alguien podría explicar por qué Apple hizo algo así?
Paul Brewczynski
@jrturton se disculpa por ser una publicación anterior y, por favor, discúlpeme porque soy nuevo en aim-c, pero actualmente es propiedad de UIViewController ... ¿solía ser un método?
Craig
58

La respuesta actual que dio IronManGill no es una buena solución, porque no se basa en la comprensión de por qué ocurre el problema en primer lugar.

La respuesta de jrturton tampoco es la forma más limpia de resolverlo. No es necesario anular. ¡Mantenlo simple!

Todo lo que necesita es configurar lo siguiente:

self.automaticallyAdjustsScrollViewInsets = NO;

en el método viewDidLoad.

Consulte los documentos: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621372-automaticallyadjustsscrollviewin

Dumoko
fuente
1
Hacer un cambio en el guión gráfico tal vez a veces sea mejor. Vaya a "Inspector de identidad" -> "Atributos de tiempo de ejecución definidos por el usuario" y agregue una definición allí.
hufeng03
automaticallyAdjustsScrollViewInsets es obsoleto. Desde iOS11, usecontentInsetAdjustmentBehavior
Cœur
47

En Interface Builder,

  • Seleccione el controlador de vista que contiene UITextView.
  • Vaya al inspector de atributos.
  • Desmarque "Ajustar las inserciones de la vista de desplazamiento".
usuario2268026
fuente
Esta es la solución más fácil para mi caso en ios8
platinor
3
Nota: es una propiedad de UIViewController. No pude encontrarlo y luego me di cuenta de que no leí el texto por completo
Maik639
37

Esto funcionó para mi

textView.textContainerInset = UIEdgeInsetsZero;  
textView.textContainer.lineFragmentPadding = 0;
Ravi Bihani
fuente
24

Ir a Interface Builder:

  1. Seleccione view controllerque contenga sutext view
  2. desmarcar Adjusts Scroll View Insetspropiedad

ingrese la descripción de la imagen aquí

Aamir
fuente
esto era lo que estaba buscando. también puede hacer esto agregando 'self.automaticallyAdjustsScrollViewInsets = false' a viewController
CodeOverRide
Esta es una respuesta buena y directa, que acaba de terminar mi búsqueda de "por qué no se muestra este texto".
UpSampler
10

Realmente me pregunto si esto es una característica real ... Este recuadro automático de 64 puntos solo se agrega cuando el UIScrollViewo UITextViewcomo la mayor profundidad de todas las subvistas de la vista del controlador de vista. Por ejemplo, si agrega una vista detrás (aquí estoy hablando de z-buffer, no de imbricación de vistas) la vista de desplazamiento, esta inserción de 64 puntos no se agrega automáticamente.

Por ejemplo, este agrega el recuadro:

ingrese la descripción de la imagen aquí

En este caso, no se agrega el recuadro:

ingrese la descripción de la imagen aquí

Esto realmente me parece extraño ... ¿Por qué el sistema operativo miraría la profundidad de la vista para decidir si debería extender la vista?

MonsieurDart
fuente
6

En Swift (Xcode 6)

 self.automaticallyAdjustsScrollViewInsets = false
Claudio Barrozo Prado
fuente
Haga esto en viewDidLoadView Controller con la vista de texto.
Suragch
automaticallyAdjustsScrollViewInsets es obsoleto. Desde iOS11, usecontentInsetAdjustmentBehavior
Cœur
6

Puede eliminar el espacio en blanco en la parte superior UITextViewagregando:

yourTextView.textContainerInset = UIEdgeInsetsZero;
lberyouk
fuente
5

Resolví este problema estableciendo el desplazamiento de contenido en un valor negativo. Aquí está el código Swift.

yourTextView.setContentOffset(CGPoint(x: 0, y: -150), animated: true)
Saqib Omer
fuente
Esta fue la mejor solución para mantener las inserciones y el desplazamiento bajo la barra translúcida correctamente. Sugeriría esta modificación. [self.textView setContentOffset:CGPointMake(0.f, -self.topLayoutGuide.length) animated:NO];
InitJason
1
Nada funcionó para mí excepto esto. Swift, Xcode 9.1.
Ashok
1

Lo que debes entender es que esto se relaciona con la barra de navegación:

  • Si su contenido va debajo de la barra de navegación, desea que el controlador de vista ajuste automáticamente las inserciones de la vista de desplazamiento (predeterminado).
  • Si su contenido no va debajo de la barra de navegación (probablemente utilizó la guía de diseño superior para la restricción de espacio superior), puede deshabilitar el ajuste de inserción de la vista de desplazamiento automático como se menciona en la mayoría de las otras respuestas.
CodeStage
fuente
1

Probé el siguiente truco, funcionó.

- (void)viewDidLoad{
   self.textView.scrollEnabled = NO;  
}       
- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   self.textView.scrollEnabled = YES;
}
casillas
fuente
1

Solución para Swift 4:

textView.textContainerInset = UIEdgeInsets.zero
Kostas Tsoleridis
fuente
0

Esta es una solución poco profesional, estoy seguro ... Pero simplemente poner una etiqueta en blanco detrás de la vista de texto resuelve el problema.

Terence
fuente
1
esto no es una solución =)
Ilker Baltaci
0

Esto simplemente funcionó para mí (disponible desde iOS 7)

[<#your UITextViewInstance#> setTextContainerInset:UIEdgeInsetsZero];
RyanTCB
fuente