porcentaje - Cómo saber cuándo UITableView se desplazó hacia abajo en iPhone
porcentaje bateria iphone ios 10 (16)
Actualización para Swift 3
La respuesta de Neoneye funcionó mejor para mí en Objective C, este es el equivalente de la respuesta en Swift 3:
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
let offset: CGPoint = scrollView.contentOffset
let bounds: CGRect = scrollView.bounds
let size: CGSize = scrollView.contentSize
let inset: UIEdgeInsets = scrollView.contentInset
let y: CGFloat = offset.y + bounds.size.height - inset.bottom
let h: CGFloat = size.height
// print("offset: %f", offset.y)
// print("content.height: %f", size.height)
// print("bounds.height: %f", bounds.size.height)
// print("inset.top: %f", inset.top)
// print("inset.bottom: %f", inset.bottom)
// print("position: %f of %f", y, h)
let reloadDistance: CGFloat = 10
if (y > h + reloadDistance) {
print("load more rows")
}
}
Me gustaría saber cuándo un UITableView
hacia abajo para cargar y mostrar más contenido, algo así como un delegado o alguna otra cosa para que el controlador sepa cuándo la tabla se desplazó hacia abajo.
¿Alguien sabe esto? Por favor, ayúdenme, ¡gracias de antemano!
Aquí está el rápido código de la versión 3.0.
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offset = scrollView.contentOffset
let bounds = scrollView.bounds
let size = scrollView.contentSize
let inset = scrollView.contentInset
let y: Float = Float(offset.y) + Float(bounds.size.height) + Float(inset.bottom)
let height: Float = Float(size.height)
let distance: Float = 10
if y > height + distance {
// load more data
}
}
Basándome en la respuesta de @Jay Mayu, que sentí que era una de las mejores soluciones:
C objetivo
// UITableViewDelegate
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// Need to call the service & update the array
if(indexPath.row + 1 == self.sourceArray.count) {
DLog(@"Displayed the last row!");
}
}
Swift 2.x
// UITableViewDelegate
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if (indexPath.row + 1) == sourceArray.count {
print("Displayed the last row!")
}
}
Generalmente uso esto para cargar más datos, cuando la última celda comienza a mostrar
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == myDataArray.count-1) {
NSLog(@"load more");
}
}
La mejor manera es probar un punto en la parte inferior de la pantalla y usar esta llamada al método cuando el usuario se desplaza ( scrollViewDidScroll
):
- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point
Pruebe un punto cerca de la parte inferior de la pantalla y luego use indexPath para comprobar si indexPath es la última fila y, en caso afirmativo, agregue filas.
Mi solución es agregar celdas antes de que la tabla vista desacelere en el desplazamiento estimado. Es predecible por velocidad.
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)offset {
NSLog(@"offset: %f", offset->y+scrollView.frame.size.height);
NSLog(@"Scroll view content size: %f", scrollView.contentSize.height);
if (offset->y+scrollView.frame.size.height > scrollView.contentSize.height - 300) {
NSLog(@"Load new rows when reaches 300px before end of content");
[[DataManager shared] fetchRecordsNextPage];
}
}
Ninguna de las respuestas anteriores me ayudó, así que se me ocurrió esto:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)aScrollView
{
NSArray *visibleRows = [self.tableView visibleCells];
UITableViewCell *lastVisibleCell = [visibleRows lastObject];
NSIndexPath *path = [self.tableView indexPathForCell:lastVisibleCell];
if(path.section == lastSection && path.row == lastRow)
{
// Do something here
}
}
Quiero realizar alguna acción en mi 1 Tableviewcell completa.
Entonces el código es link the:
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
NSArray* cells = self.tableView.visibleCells;
NSIndexPath *indexPath = nil ;
for (int aIntCount = 0; aIntCount < [cells count]; aIntCount++)
{
UITableViewCell *cell = [cells objectAtIndex:aIntCount];
CGRect cellRect = [self.tableView convertRect:cell.frame toView:self.tableView.superview];
if (CGRectContainsRect(self.tableView.frame, cellRect))
{
indexPath = [self.tableView indexPathForCell:cell];
// remain logic
}
}
}
Que esto sea de ayuda para alguien.
Tomando neoneye excelentes respuestas pero en rápida, y cambio de nombre de las variables ..
Básicamente sabemos que hemos llegado al final de la vista de tabla si yOffsetAtBottom
está más allá de la altura del contenido de la tabla.
func isTableViewScrolledToBottom() -> Bool {
let tableHeight = tableView.bounds.size.height
let contentHeight = tableView.contentSize.height
let insetHeight = tableView.contentInset.bottom
let yOffset = tableView.contentOffset.y
let yOffsetAtBottom = yOffset + tableHeight - insetHeight
return yOffsetAtBottom > contentHeight
}
Uso – tableView:willDisplayCell:forRowAtIndexPath:
(método UITableViewDelegate
)
Simplemente compare el indexPath
con los elementos en su matriz de datos (o cualquier fuente de datos que use para su vista de tabla) para averiguar si se visualiza el último elemento.
agregue este método en UITableViewDelegate
:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat height = scrollView.frame.size.height;
CGFloat contentYoffset = scrollView.contentOffset.y;
CGFloat distanceFromBottom = scrollView.contentSize.height - contentYoffset;
if(distanceFromBottom < height)
{
NSLog(@"end of the table");
}
}
en Swift
puedes hacer algo como esto. La siguiente condición será verdadera cada vez que llegue al final de la tabla vista
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.row+1 == postArray.count {
println("came to last row")
}
}
en el delegado de la vista de tabla haga algo como esto
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
CGPoint offset = aScrollView.contentOffset;
CGRect bounds = aScrollView.bounds;
CGSize size = aScrollView.contentSize;
UIEdgeInsets inset = aScrollView.contentInset;
float y = offset.y + bounds.size.height - inset.bottom;
float h = size.height;
// NSLog(@"offset: %f", offset.y);
// NSLog(@"content.height: %f", size.height);
// NSLog(@"bounds.height: %f", bounds.size.height);
// NSLog(@"inset.top: %f", inset.top);
// NSLog(@"inset.bottom: %f", inset.bottom);
// NSLog(@"pos: %f of %f", y, h);
float reload_distance = 10;
if(y > h + reload_distance) {
NSLog(@"load more rows");
}
}
UITableView
es una subclase de UIScrollView
y UITableViewDelegate
ajusta a UIScrollViewDelegate
. Por lo tanto, el delegado que adjunte a la vista de tabla obtendrá eventos como scrollViewDidScroll:
y puede llamar a métodos como contentOffset
en la vista de tabla para encontrar la posición de desplazamiento.
Los neoneyes modificados responden un poco.
Esta respuesta se dirige a aquellos de ustedes que solo quieren que el evento se desencadene una vez por cada lanzamiento del dedo .
Adecuado para cargar más contenido de algún proveedor de contenido (servicio web, datos básicos, etc.). Tenga en cuenta que este enfoque no respeta el tiempo de respuesta de su servicio web.
- (void)scrollViewDidEndDragging:(UIScrollView *)aScrollView
willDecelerate:(BOOL)decelerate
{
CGPoint offset = aScrollView.contentOffset;
CGRect bounds = aScrollView.bounds;
CGSize size = aScrollView.contentSize;
UIEdgeInsets inset = aScrollView.contentInset;
float y = offset.y + bounds.size.height - inset.bottom;
float h = size.height;
float reload_distance = 50;
if(y > h + reload_distance) {
NSLog(@"load more rows");
}
}
NSLog(@"%f / %f",tableView.contentOffset.y, tableView.contentSize.height - tableView.frame.size.height);
if (tableView.contentOffset.y == tableView.contentSize.height - tableView.frame.size.height)
[self doSomething];
Agradable y simple