tutorial tablas efecto apple ios iphone uitableview scroll detect

ios - tablas - uitableview swift4



UITableView detectando la Ășltima celda (7)

¿Cómo puedo detectar cuando un UITableView se ha desplazado a la parte inferior para que la última celda sea visible?


Crea una elegante extensión para UITableView :

extension UITableView { func isLast(for indexPath: IndexPath) -> Bool { let indexOfLastSection = numberOfSections > 0 ? numberOfSections - 1 : 0 let indexOfLastRowInLastSection = numberOfRows(inSection: indexOfLastSection) - 1 return indexPath.section == indexOfLastSection && indexPath.row == indexOfLastRowInLastSection } }

Ejemplo de uso:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if tableView.isLast(for: indexPath) { //do anything then } return cell }


Dentro de tableView:cellForRowAtIndexPath: o tableView:willDisplayCell:forRowAtIndexPath: como esto:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ... NSInteger sectionsAmount = [tableView numberOfSections]; NSInteger rowsAmount = [tableView numberOfRowsInSection:[indexPath section]]; if ([indexPath section] == sectionsAmount - 1 && [indexPath row] == rowsAmount - 1) { // This is the last cell in the table } ... }


Implemente el tableView:willDisplayCell:forRowAtIndexPath: en su UITableViewDelegate y verifique si es la última fila.


Para Xcode 8 y Swift 3

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { let lastSectionIndex = tableView.numberOfSections - 1 let lastRowIndex = tableView.numberOfRows(inSection: lastSectionIndex) - 1 if indexPath.section == lastSectionIndex && indexPath.row == lastRowIndex { print("this is the last cell") } }


Para Xcode 9 y Swift 4

//Show Last Cell (for Table View) func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if indexPath.row == (yourdataArray.count - 1) { print("came to last row") } } //Show last cell (for Collection View) func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { if indexPath.row == (yourdataArray.count - 1) { // Last cell is visible } }


Tuve algunos problemas con el método willDisplayCell. Esto funciona para mí:

func scrollViewDidScroll(_ scrollView: UIScrollView) { let y = scrollView.contentOffset.y/(scrollView.contentSize.height - scrollView.frame.size.height) let relativeHeight = 1 - (table.rowHeight / (scrollView.contentSize.height - scrollView.frame.size.height)) if y >= relativeHeight{ print("last cell is visible") } }

Simplemente pase esto en los métodos de delegado y cambie la "tabla" a su tableView.


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger lastSectionIndex = [tableView numberOfSections] - 1; NSInteger lastRowIndex = [tableView numberOfRowsInSection:lastSectionIndex] - 1; if ((indexPath.section == lastSectionIndex) && (indexPath.row == lastRowIndex)) { // This is the last cell } }