How to scroll to the top of UITableView with smooth animation?

In my table view I have to scroll to the top. But I cannot guarantee that the first object is going to be section 0, row 0. May be that my table view will start from section number 5.

So I get an exception, when I call:

[mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

Is there another way to scroll to the top of table view?


UITableView is a subclass of UIScrollView, so you can also use:

[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];


[mainTableView setContentOffset:CGPointZero animated:YES];

And in Swift:

mainTableView.setContentOffset(, animated:true)

I prefer

[mainTableView setContentOffset:CGPointZero animated:YES];

It's better to not use NSIndexPath (empty table), nor assume that top point is CGPointZero (content insets), that's what I use -

[tableView setContentOffset:CGPointMake(0.0f, animated:YES];

Hope this helps.

This code helps you to make section to scroll to top

CGRect cellRect = [tableinstance rectForSection:section];
CGPoint origin=[tableinstacne convertPoint:cellRect.origin fromView: <tableistance>];
[tableinstance setContentOffset:CGPointMake(0, origin.y)];

For tables that have a contentInset, setting the content offset to CGPointZero will not work. It'll scroll to the content top vs. scrolling to the table top.

Taking content inset into account produces this instead:

[tableView setContentOffset:CGPointMake(0, animated:NO];

Swift :

if you don't have tableView header :

tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)

if so :

tableView.setContentOffset(CGPointMake(0, -tableViewheader.frame.height   + UIApplication.sharedApplication().statusBarFrame.height ), animated: true)


tableView.setContentOffset(CGPointZero, animated: true)

Adding on to what's already been said, you can create a extension (Swift) or category (Objective C) to make this easier in the future:


extension UITableView {
    func scrollToTop(animated: Bool) {
        setContentOffset(CGPointZero, animated: animated)

Any time you want to scroll any given tableView to the top you can call the following code:


If you i would like move scroll animation in the table, use this code. The scroll move to top with animation in .5 seconds.

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

[_tableContent scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

[UIView commitAnimations];

in swift

your row = selectioncellRowNumber your section if you have = selectionNumber if you dont have set is to zero

//UITableViewScrollPosition.Middle or Bottom or Top

       var lastIndex = NSIndexPath(forRow:  selectioncellRowNumber, inSection: selectionNumber)
       self.tableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Middle, animated: true)

I had to add the multiply by -1 * to the sum of the status bar and the navigation bar, because it was going that height off the screen,

self.tableView.setContentOffset(CGPointMake(0 , -1 *
  (self.navigationController!.navigationBar.height +
  UIApplication.sharedApplication().statusBarFrame.height) ), animated:true)

Possible Actions:

1)   func scrollToFirstRow() {
      let indexPath = NSIndexPath(forRow: 0, inSection: 0)
      self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)

2)    func scrollToLastRow() {
      let indexPath = NSIndexPath(forRow: objects.count - 1, inSection: 0)
      self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true)

3)    func scrollToSelectedRow() {
      let selectedRows = self.tableView.indexPathsForSelectedRows
      if let selectedRow = selectedRows?[0] as? NSIndexPath {
        self.tableView.scrollToRowAtIndexPath(selectedRow, atScrollPosition: .Middle, animated: true)

 4)   func scrollToHeader() {
      self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)

5) func scrollToTop(){

self.tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)

Disable Scroll To Top:

func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) {
    for subview in view.subviews {
        if let scrollView = subview as? UIScrollView {
            (scrollView as UIScrollView).scrollsToTop = false
        self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView)

Modify and use it as per requirement.

If you don't want scrolling, you can start and stop the scrolling animation as soon as you start it.

    $('document').ready(function() {
    $("html, body").animate({ scrollTop: 0 }, 500);
    return true;

Also, to animate put values for 'x' and 'y', passing in 0,0 will scroll the page to the top left instantly.

window.scrollTo(x, y);

Category: ios Time: 2009-04-07 Views: 2

Related post

iOS development

Android development

Python development

JAVA development

Development language

PHP development

Ruby development


Front-end development


development tools

Open Platform

Javascript development

.NET development

cloud computing


Copyright (C), All Rights Reserved.

processed in 3.946 (s). 13 q(s)