How to know when UITableView did scroll to bottom in iPhone How to know when UITableView did scroll to bottom in iPhone ios ios

How to know when UITableView did scroll to bottom in iPhone


in the tableview delegate do something like this

ObjC:

- (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");    }}

Swift:

func scrollViewDidScroll(_ scrollView: UIScrollView) {    let offset = scrollView.contentOffset    let bounds = scrollView.bounds    let size = scrollView.contentSize    let inset = scrollView.contentInset    let y = offset.y + bounds.size.height - inset.bottom    let h = size.height    let reload_distance:CGFloat = 10.0    if y > (h + reload_distance) {        print("load more rows")    }}


Modified neoneyes answer a bit.

This answer targets those of you who only wants the event to be triggered once per release of the finger.

Suitable when loading more content from some content provider (web service, core data etc).Note that this approach does not respect the response time from your web service.

- (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");    }}


add this method in the 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");    }}