I have a UITableView
that is populated with cells of a variable height. I would like the table to scroll to the bottom when the view is pushed into view.
I currently have the following function
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[log count]-1 inSection:0];
[self.table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
log is a mutable array containing the objects that make up the content of each cell.
The above code works fine in viewDidAppear
however this has the unfortunate side effect of displaying the top of the table when the view first appears and then jumping to the bottom. I would prefer it if the table view
could be scrolled to the bottom before it appears.
I tried the scroll in viewWillAppear
and viewDidLoad
but in both cases the data has not been loaded into the table yet and both throw an exception.
Any guidance would be much appreciated, even if it's just a case of telling me what I have is all that is possible.
For Swift 3 ( Xcode 8.1 ):
In Swift, you just need
to make it automatically scroll to the buttom
I believe old solutions do not work with swift3.
If you know number rows in table you can use :
Using the above solutions, this will scroll to the bottom of your table (only if the table content is loaded first):
Actually a "Swifter" way to do it in swift is :
work Perfect for me.
After a lot of fiddling this is what worked for me:
The key turned out to be not wrapping
scrollToRowAtIndexPath
inside ofdispatch_async
as some have suggested, but simply following it with a call tolayoutIfNeeded
.My understanding of this is, calling the scroll method in the current thread guarantees that the scroll offset is set immediately, before the view is displayed. When I was dispatching to the main thread, the view was getting displayed for an instant before the scroll took effect.
(Also NB you need the
viewHasAppeared
flag because you don't want togoToBottom
every timeviewDidLayoutSubviews
is called. It gets called for example whenever the orientation changes.)