2009-08-31 8 views
18

Tengo una UITableView cuyos contenidos cambian dinámicamente, como una pila FIFO. Las celdas se agregan a la parte inferior y se eliminan de la parte superior.Cómo desplazar una UITableView a la tablaFooterView

Esto funciona muy bien, y puedo desplazarme a indexPath para que el mensaje más nuevo siempre se desplace hacia abajo (como una aplicación de chat).

Ahora ... Quiero agregar un pie de página a esa sección de la tabla. En lugar de utilizar

SrollToRowAtIndexPath

Me gustaría ser capaz de desplazarse a la tableFooterView.

Cualquier idea de cómo puedo hacer eso sería apreciada.

Respuesta

-4

No lo he intentado, pero ¿qué sucede cuando se desplaza a la última fila + 1?

Otra idea sería agregar siempre una entrada ficticia al final y hacer que tenga un aspecto diferente para que se vea como un pie de página. Entonces siempre puedes desplazarte hacia eso.

+1

aparece el error de rango :(Debería haber mencionado que ya probé esa en la publicación original. – Kevin

3

Desde UITableView es una subclase de UIScrollView, puede desplazarse a cualquier lugar que desee con el método UIScrollView

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated

Sólo hay que establecer el rect modo que cuando es visible el pie de página es visible, y que tendrá su solución (puede usar el rectificador del pie de página u otra cosa, siempre y cuando obtenga el comportamiento correcto todo el tiempo).

4

Tal vez algo como:

[tableView setContentOffset:CGPointMake(0, tableView.contentSize.height) animated:YES]; 
1

La forma más sencilla de hacerlo es utilizar UITableViewScrollPositionTop en la última fila en la última sección. Esto funciona muy bien para mí ...

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:LAST_ROW inSection:LAST_SECTION] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

Asegúrese de que su tabla de pie de página View está bien divididas en la parte inferior y que debe sentarse muy bien animada dentro de la vista ...

Espero que esto ayude .. .

0

Gran idea, estaba buscando esto por mí mismo :) Aquí está el código de ejemplo, que haría el truco:

[tableView reloadData]; 
NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:1]; 
[tableView scrollToRowAtIndexPath:index 
    atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

debe tener al menos una célula en el pie de página tableView, la el problema es que va a ser visible. No tuve tiempo de probar, pero supongo que podrías hacerlo realmente pequeño.

Además se debe poner en práctica las cosas correcta dentro numberOfSectionsInTableView (al menos uno por mesa y uno para el pie de página), numberOfRowsInSection (al menos uno de pie de página, su última sección), viewForHeaderInSection (cero, excepto para su celular), heightForHeaderInSection (tal vez si se establece este como cero), cellForRowAtIndexPath (añadir caso especial para su celular en el pie de página) ...

Eso debería ser suficiente.

25

La mejor manera de desplazar un UITableView hasta la parte inferior de su footerView es simplemente configurar el desplazamiento del contenido. Puede calcular la parte inferior usando contentSize y la actual bounds

Aquí está la forma en que lo hago.

CGPoint newContentOffset = CGPointMake(0, [self.instanceOfATableView contentSize].height - self.instanceOfATableView.bounds.size.height); 

[self.instanceOfATableView setContentOffset:newContentOffset animated:YES]; 
+0

Solo logré que funcionara cuando agregué un retraso después invocando reloadTable: [self performSelector: @selector (scrollToBottom) withObject: nil afterDelay: 0.3] – Centurion

0

estoy usando esto:

- (void)scrollToBottom{ 
    [self.myTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[self.fetchedResultsController.fetchedObjects count] -1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

}

13

Gracias a iphone_developer aquí es lo que hice:

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[tableView numberOfRowsInSection:0]-1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

Entonces, mientras yo estoy añadiendo filas, me Estoy llamando a esto y la vista de pie de página de mi tableView sigue siendo visible

+0

esto se desplazará al extremo superior no inferior – khalil

+2

No, [tableView numberOfRowsInSection: 0] -1 es la última fila, por lo que se desplaza a positionTop en este fila realmente desplazará la tabla Vista a la parte inferior – Bejil

+0

@Beji esto supone que tiene una sola sección – Jessedc

27

estoy usando esta para desplazarse a la vista de un pie de página tableView:

[self.tableView scrollRectToVisible:[self.tableView convertRect:self.tableView.tableFooterView.bounds fromView:self.tableView.tableFooterView] animated:YES]; 
+2

¡Simple y fácil de usar en cualquier lugar! –

+0

+1! esta es la respuesta correcta, cada otra respuesta que probé no funcionó correctamente bajo ciertas circunstancias. – JohnPayne

+0

En teoría, eso es bueno, en la práctica no se puede encadenar con las actualizaciones de la vista de tabla, como las inserciones y las eliminaciones de filas mientras se anima la vista de tabla. scrollToIndexPath funciona para eso – n13

1

Este buen trabajo para mí!

CGRect footerBounds = [addCommentContainer bounds]; 
CGRect footerRectInTable = [tableview convertRect:footerBounds fromView:addCommentContainer]; 
[tableview scrollRectToVisible:footerRectInTable animated:YES]; 
2

Mi respuesta tardía es para el desarrollador, que debe mostrar el pie de página cuando se muestra el teclado. La solución correcta es considerar contentInset propiedad (que se puede cambiar después de que se muestra el teclado), así que es muy fácil:

- (void)scrollToFooter { 
    UIEdgeInsets tableInsets = self.tableView.contentInset; 
    CGFloat tableHeight = self.tableView.frame.size.height - tableInsets.bottom - tableInsets.top; 
    CGFloat bottom = CGRectGetMaxY(self.tableView.tableFooterView.frame); 
    CGFloat offset = bottom - tableHeight; 
    if(offset > 0.f) { 
    [self.tableView setContentOffset:CGPointMake(0, offset) animated:YES]; 
    } 
} 

debo notar, que en mi caso tableView se añadió a mi propia ViewController y uno de las celdas tienen UITextField que se convierte en el primer respondedor. Para mostrar el pie de página cuando se muestra el teclado, necesita registrar el teclado, se muestra la notificación y (en iOS7) realizar este método al final del ciclo de ejecución actual, porque en este caso iOS7 ejecuta automáticamente scrollToRowAtIndexPath después de que nuestro método y pie de página no se muestren.

-(void)registerKeyboardNotification { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardDidShown:) 
               name:UIKeyboardDidShowNotification object:nil]; 
} 

- (void)keyboardDidShown:(id)notification { 
    //move to the end of run loop 
    [self performSelector:@selector(scrollToFooter) withObject:nil afterDelay:.0]; 
} 
11

Muchas respuestas pobres. :-)

la mejor manera:

[self.tableView scrollRectToVisible: 
    self.tableView.tableFooterView.frame animated:YES 
]; 
+0

Esto supone que 'tableFooterView' siempre será una subvista directa de' tableView' o que se encuentra en el origen de cualquier vista intermedia. Si bien esto podría funcionar ahora, no hay garantías de que la jerarquía de subvista 'tableView' se mantendrá igual en futuras versiones de iOS. – Ned

+0

@Kumar KL, esto no funciona con el pie de página personalizado y el pie de página múltiple. –

0

este trabajo a mí:

- (void)tableViewScrollToBottomAnimated:(BOOL)animated { 
    NSInteger numberOfRows = [self.tableView numberOfRowsInSection:0]; 
    if (numberOfRows) { 
     if (self.tableView.tableFooterView) { 
      [self.tableView scrollRectToVisible: 
      self.tableView.tableFooterView.frame animated:YES 
      ]; 
     } else { 
      [self.tableView scrollToRowAtIndexPath: 
      [NSIndexPath indexPathForRow:numberOfRows-1 inSection:0] 
            atScrollPosition:UITableViewScrollPositionBottom 
              animated:animated 
      ]; 
     } 
    } 
} 
0

Esto funciona para mí en Swift 4

func addRow() { 
    tableView.beginUpdates() 
    tableView.insertRows(at: [IndexPath(row: array.count - 1, section: 0)], with: .automatic) 
    tableView.endUpdates() 

    DispatchQueue.main.async { 
     self.scrollToBottom() 
    } 
} 

func scrollToBottom() { 
    let footerBounds = tableView.tableFooterView?.bounds 
    let footerRectInTable = tableView.convert(footerBounds!, from: tableView.tableFooterView!) 
    tableView.scrollRectToVisible(footerRectInTable, animated: true) 
} 
Cuestiones relacionadas