UITextView contentOffset cambia entre viewDidLoad y viewDidAppear

En iOS 8 (no he probado en iOS 7) tengo una UITextView que tiene su text en el guión gráfico. Cuando la vista realmente aparece, el text aparece desplazado y no quiero que se desplace. De hecho, no tengo idea de por qué alguien lo haría. ¿Alguien puede explicar cómo cambiar este comportamiento para que aparezca desplazado hacia arriba como debería?

Esto es extremadamente fácil de reproducir:

  1. Iniciar un nuevo proyecto
  2. Agregue un UITextView con restricciones para UITextView a los márgenes
  3. Llénelo con más text que cabrá en sus límites (ayuda a boost el tamaño de la fuente a algo así como 36).
  4. Correr.

Es inmediatamente obvio visualmente, pero si registra lo que está sucediendo verá algo como lo siguiente:

 2015-03-10 10:34:47.198 ScrollViewTest[61180:2610445] [Inside viewDidLoad] <UITextView: 0x7f9c79851200; frame = (0 0; 600 600); text = 'Lorem ipsum dolor sit er ...'; clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7f9c78c89df0>; layer = <CALayer: 0x7f9c78c8c220>; contentOffset: {0, 0}; contentSize: {600, 592}> 2015-03-10 10:34:47.288 ScrollViewTest[61180:2610445] [Inside viewDidAppear] <UITextView: 0x7f9c79851200; frame = (0 0; 375 667); text = 'Lorem ipsum dolor sit er ...'; clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7f9c78c89df0>; layer = <CALayer: 0x7f9c78c8c220>; contentOffset: {0, 457.5}; contentSize: {375, 1176}> 

Presumiblemente, esto se debe al cambio de frame y / o de contentSize desde la carga inicial del guión gráfico hasta las dimensiones reales que necesita mostrar.

Esto parece similar a UITextView contentOffset se establece pero la respuesta aceptada a esa pregunta no funciona. Esto tampoco se resuelve estableciendo self.automaticallyAdjustsScrollViewInsets = NO .

Mi conjetura es que cuando se aplica la distribución automática, la compensación de contenido se rompe. Esto ocurre justo antes de que se realice la -layoutSubviews .

Así que para solucionar este problema, podría recomendar dos soluciones.

  1. Subclass UITextView y configure contentOffset en -layoutSubviews .
  2. Agregue -viewDidLayoutSubviews a su controller de vista y configure contentOffset para cualquier vista de text allí.

Ambos son una especie de soluciones hacky, pero son mejores soluciones hacky que -viewDidAppear: o dispatch_async() .


NOTA : tenga cuidado para asegurarse de que solo ajuste el contentOffset la contentOffset en -layoutSubviews o -viewDidLayoutSubviews cuando corresponda.

Me enfrenté al mismo problema. Me deshice de eso simplemente agregando un código de 1 línea en viewDidAppear

 [yourTextView setContentOffset: CGPointMake(0,0) animated:NO]; 

Puede jugar con CGPointMake como desee, pero esto funcionó bien para mí. Espero que esto ayude.