2012-04-06 10 views
6

Tengo una vista de tabla que se desplaza un poco hacia abajo en mi aplicación de iPad (OS X 10.7.3, Xcode 4.3.2) y no estoy seguro de dónde buscar la causa. Aquí está la situación:UITableView se desplaza automáticamente hacia abajo después de reloadData

La UITableView llena toda la pantalla, y la mayoría de las celdas son células de altura fija. La única excepción es una celda que contiene una UITextView, y es de altura dinámica (o en otras palabras, la altura de la celda se ajusta para ajustarse a la cantidad de texto).

El problema se manifiesta si en la tabla se corta la celda de altura dinámica cuando la vista de tabla está en la parte superior. Cuando la vista se carga por primera vez, la tabla se dibuja de forma normal, con solo una parte de la celda UITextView visible. Sin embargo, si visualizo un UIPopoverController, necesito hacer un ReloadData después de que se descarte el popover, y cuando lo haga, la vista de tabla se desplazará hacia abajo lo suficiente como para mostrar todo el UITextView. (No es la celda que contiene el UITextView lo que importa, solo el UITextView. La tabla es una tabla agrupada, y la celda UITextView es la única celda en la sección, por lo que el borde inferior redondeado aún no está visible después de este desplazamiento fantasma)

No puedo ver ningún código en mi aplicación que esté desplazando la vista de tabla o estableciendo un desplazamiento de contenido, por lo que estoy totalmente confundido en cuanto a qué podría estar causando esto.

Para tratar de restringirlo, configuré mi vista para honrar a UIScrollViewDelegate, y si pongo un punto de interrupción en el método scrollViewDidScroll: el programa se detiene después de que el popover desaparece y me da la siguiente traza inversa :

(lldb) bt 
* thread #1: tid = 0x1f03, 0x0005245f MyApp`-[ContactDisplayViewController scrollViewDidScroll:] + 31 at ContactDisplayViewController.m:1143, stop reason = breakpoint 3.1 
    frame #0: 0x0005245f MyApp`-[ContactDisplayViewController scrollViewDidScroll:] + 31 at ContactDisplayViewController.m:1143 
    frame #1: 0x017e3494 UIKit`-[UIScrollView setContentOffset:] + 521 
    frame #2: 0x0180804d UIKit`-[UITableView setContentOffset:] + 334 
    frame #3: 0x017d495e UIKit`-[UIScrollViewScrollAnimation setProgress:] + 523 
    frame #4: 0x0183d234 UIKit`-[UIAnimator(Static) _advance:] + 255 
    frame #5: 0x02c013a3 GraphicsServices`HeartbeatTimerCallback + 35 
    frame #6: 0x023278c3 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19 
    frame #7: 0x02328e74 CoreFoundation`__CFRunLoopDoTimer + 1220 
    frame #8: 0x022852c9 CoreFoundation`__CFRunLoopRun + 1817 
    frame #9: 0x02284840 CoreFoundation`CFRunLoopRunSpecific + 208 
    frame #10: 0x02284761 CoreFoundation`CFRunLoopRunInMode + 97 
    frame #11: 0x02bfe1c4 GraphicsServices`GSEventRunModal + 217 
    frame #12: 0x02bfe289 GraphicsServices`GSEventRun + 115 
    frame #13: 0x017a4c93 UIKit`UIApplicationMain + 1160 
    frame #14: 0x0000263d MyApp`main + 125 at main.m:14 

Y si imprimo el ScrollView en ese método, se nota que el UITableView está en movimiento (no sé donde la contentOffset está viniendo):

Printing description of scrollView: 
<UITableView: 0xc3ed400; frame = (0 99; 383 817); clipsToBounds = YES; 
autoresize = W+RM+H; layer = <CALayer: 0x7bf1a40>; contentOffset: {0, 14}> 

Este desplazamiento fantasma está mostrando en el dispositivo y el simulador, y en iOS 4.3, 5.0 y 5.1. ¿Alguien tiene alguna idea?

+1

Recuerdo vagamente haber escuchado algo sobre esto antes. Como UITableViews es una subclase UIScrollView y también lo es UITextViews, puede confundirse. En un intento quizás intente cambiar algunas propiedades en el TextView antes de volver a cargar, como deshabilitar el desplazamiento? – GregularExpressions

+0

Está en lo cierto, deshabilitando el desplazamiento en la vista de texto antes de que reloadData mantuviera oculto el desplazamiento fantasma. Si publica su comentario como respuesta, lo aceptaré. Gracias. –

Respuesta

1

Tengo un vago recuerdo de haber escuchado algo sobre esto antes. Como UITableViews son una subclase UIScrollView y también UITextViews, pueden confundirse.

Supongo que tal vez intente cambiar algunas propiedades en el TextView antes de volver a cargar, como deshabilitar el desplazamiento?

[myTextView setScrollEnabled:NO]; 
0

que una subclase de la subclase UIScrollView (en mi caso subclase UITextField) y asegúrese de que no acepto "arbitrarias" compensaciones de contenido:

override var contentOffset: CGPoint { 
    set { 
     let maxContentOffsetY = max(self.contentSize.height - self.frame.size.height, 0.0) 
     super.contentOffset.y = min(newValue.y, maxContentOffsetY) 
    } 
    get { 
     return super.contentOffset 
    } 
} 
Cuestiones relacionadas