UITableView , Scroll to bottom on reload?

IphoneObjective CCocoa Touch

Iphone Problem Overview


I have a UITableView with cells that are dynamically updated. Everything works fine apart from when tableview.reload is called (see below) to refresh the cells in the table I would like the table to scroll to the bottom to show the new entries.

- (void)reloadTable:(NSNotification *)notification {
    NSLog(@"RELOAD TABLE ...");
	[customTableView reloadData];
    // Scroll to bottom of UITable here ....
}

I was planning to use scrollToRowAtIndexPath:atScrollPosition:animated: but then noticed that I don't have access to an indexPath.

Does anyone know how to do this, or of a delegate callback that I could use?

Iphone Solutions


Solution 1 - Iphone

Use:

NSIndexPath* ipath = [NSIndexPath indexPathForRow: cells_count-1 inSection: sections_count-1];
[tableView scrollToRowAtIndexPath: ipath atScrollPosition: UITableViewScrollPositionTop animated: YES];

Or you can specify the section index manually (If one section => index=0).

Solution 2 - Iphone

Another solution is to flip the table vertically, and flip each cell vertically:

Apply the transform to the UITableView when initializing:

tableview.transform = CGAffineTransformMakeScale(1, -1);

and in cellForRowAtIndexPath:

cell.transform = CGAffineTransformMakeScale(1, -1);

This way you don't need workarounds for scrolling issues, but you will need to think a little harder about contentInsets/contentOffsets and header/footer interactions.

Solution 3 - Iphone

-(void)scrollToBottom{
       
        [self.tableView scrollRectToVisible:CGRectMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height) animated:YES];
    
}

Solution 4 - Iphone

//In swift 

var iPath = NSIndexPath(forRow: self.tableView.numberOfRowsInSection(0)-1, 
                        inSection: self.tableView.numberOfSections()-1)
self.tableView.scrollToRowAtIndexPath(iPath, 
                                      atScrollPosition: UITableViewScrollPosition.Bottom,                     
                                      animated: true)

Solution 5 - Iphone

Swift 3

For all the folks here trying to figure out how to solve this problem the key is to call the .layoutIfNeeded() method after .reloadData() :

tableView.reloadData()
tableView.layoutIfNeeded()
tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentSize.height - tableView.frame.height), animated: false)

I was working with multiple sections in UITableView and it worked well.

Solution 6 - Iphone

Fot Swift 5

extension UITableView {
    func scrollToBottom(animated: Bool = true) {
        let section = self.numberOfSections
        if section > 0 {
            let row = self.numberOfRows(inSection: section - 1)
            if row > 0 {

                self.scrollToRow(at: IndexPath(row: row-1, section: section-1), at: .bottom, animated: animated)
            }
        }
    }
}

Solution 7 - Iphone

As this is something you might want to use really often, I suggest that you create a class extension on UITableView :

extension UITableView {
    func scrollToBottom(animated: Bool = true) {
        let section = self.numberOfSections
        if section > 0 {
            let row = self.numberOfRowsInSection(section - 1)
            if row > 0 {
                self.scrollToRowAtIndexPath(NSIndexPath(forRow: row - 1, inSection: section - 1), atScrollPosition: .Bottom, animated: animated)
            }
        }
    }
}

Solution 8 - Iphone

This is another solution, worked well in my case, when cell height is big.

- (void)scrollToBottom
{
    CGPoint bottomOffset = CGPointMake(0, _bubbleTable.contentSize.height - _bubbleTable.bounds.size.height);
    if ( bottomOffset.y > 0 ) {
        [_bubbleTable setContentOffset:bottomOffset animated:YES];
    }
}

Solution 9 - Iphone

extension is better to be done on UIScrollView instead of UITableView, this way it works on scrollView, tableView, collectionView (vertical), UIWebView (inner scroll view), etc

public extension UIScrollView {
    
    public func scrollToBottom(animated animated: Bool) {
        let rect = CGRectMake(0, contentSize.height - bounds.size.height, bounds.size.width, bounds.size.height)
        scrollRectToVisible(rect, animated: animated)
    }
    
}

Solution 10 - Iphone

Swift 5

    func scrollToBottom() {
        let section = self.tableView.numberOfSections
        let row = self.tableView.numberOfRows(inSection: self.tableView.numberOfSections - 1) - 1;
        guard (section > 0) && (row > 0) else{ // check bounds
            return
        }
        let indexPath = IndexPath(row: row-1, section: section-1)
        self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
    }

I dont agree that we should user cells_count,sections_count ,self.dateSource.countand so on, Instead, the delegate will be better.

Solution 11 - Iphone

This is the best way.

- (void)scrollToBottom
{
    CGFloat yOffset = 0;

    if (self.tableView.contentSize.height > self.tableView.bounds.size.height) {
        yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
    }

    [self.tableView setContentOffset:CGPointMake(0, yOffset) animated:NO];
}

Solution 12 - Iphone

try this code, It may help you:

    self.tableView.reloadData()
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+0.1, execute: {
        let indexPath = IndexPath(row: self.dateSource.count-1, section: 0)
        self.tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: true)
    })

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionfuzzygoatView Question on Stackoverflow
Solution 1 - IphoneMaxView Answer on Stackoverflow
Solution 2 - IphoneMichael WilsonView Answer on Stackoverflow
Solution 3 - IphonemkralView Answer on Stackoverflow
Solution 4 - IphoneytbryanView Answer on Stackoverflow
Solution 5 - IphoneChris TsitsarisView Answer on Stackoverflow
Solution 6 - IphonepVaskouView Answer on Stackoverflow
Solution 7 - IphonejfgrangView Answer on Stackoverflow
Solution 8 - IphoneDenis KutlubaevView Answer on Stackoverflow
Solution 9 - IphonearyaxtView Answer on Stackoverflow
Solution 10 - IphonemistdonView Answer on Stackoverflow
Solution 11 - IphoneJigar PatelView Answer on Stackoverflow
Solution 12 - IphonemuhlenXiView Answer on Stackoverflow