Nupur Rawat
Nupur Rawat

Reputation: 165

How to detect last visible cell in UITableView

I am new in iOS development and currently working on UITableView. I want to find last visible cells on the screen of device and cells that are at the bottom of the screen must be of blue color, which should fade to green as the cell is scrolled to the top of the screen.

I have gone through these links

Link1 Link2

But could not get success. Can anyone please provide idea how to detect last cells & cell fade animation?

Upvotes: 3

Views: 11944

Answers (4)

OhadM
OhadM

Reputation: 4803

@shallowThought solution will only work if cells are already presented.

But, if you want to know the last cell when cells aren't presented yet and are going to be presented, we can create an extension for UITableView as follow:

func isLastVisibleCell(at indexPath: IndexPath) -> Bool {
    guard let lastIndexPath = indexPathsForVisibleRows?.last else {
        return false
    }
    return lastIndexPath == indexPath
}

This way, you can check tableView.isLastVisibleCell(...) multiple times until you have reached actual visible cell.

Upvotes: 2

Berlin
Berlin

Reputation: 2201

In Swift 3.0, you can used this tableview method.

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
    let intTotalrow = tableView.numberOfRows(inSection:indexPath.section)//first get total rows in that section by current indexPath.           
    //get last last row of tablview
    if indexPath.row == intTotalrow - 1{

        // call for last display 
    }
}

Upvotes: 3

Sathish Kumar VG
Sathish Kumar VG

Reputation: 2172

Try this code, It will work

Initially Declare

int firstIndexRow;
int lastIndexRow;

Write below code inside of ViewDidLoad()

 [myTable reloadData]; //Reload because get visible last cell index row
firstIndexRow = 0;

lastIndexRow = (int)[self.myTable.indexPathsForVisibleRows lastObject].row;

NSLog(@"first : %d",firstIndexRow);
NSLog(@"Bottom : %d",lastIndexRow);


- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{


    NSIndexPath *firstVisibleIndexPath = [[self.myTable indexPathsForVisibleRows] objectAtIndex:0];

    NSIndexPath *lastObject = [self.myTable.indexPathsForVisibleRows lastObject];

    firstIndexRow = (int)firstVisibleIndexPath.row;

    lastIndexRow = (int)lastObject.row;

    NSLog(@"first : %d",firstIndexRow);
    NSLog(@"Bottom : %d",lastIndexRow);

    [myTable reloadData];

}


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [myTable dequeueReusableCellWithIdentifier:@"cell"];

    if (indexPath.row == firstIndexRow) {
        cell.textLabel.textColor = [UIColor blueColor];
    }else if (indexPath.row == lastIndexRow) {
        cell.textLabel.textColor = [UIColor greenColor];
    }else{
        cell.textLabel.textColor = [UIColor grayColor];
    }

    cell.textLabel.text =[namesArray objectAtIndex:indexPath.row];


    return cell;
}

Upvotes: 0

shallowThought
shallowThought

Reputation: 19602

Get last visible cell:

if let lastCell = tableView.visibleCells.last {
    // do something with lastCell
}

Upvotes: 5

Related Questions