Search code examples
iosobjective-cxcodeuitableviewstoryboard

How to vertical align (center) the content of UITableView?


I want to center the content of my UITableView that contains headerView and footerView created at storyboard, and UITableViewCells. How can I achieve this?

Here is what I'm trying to implement to solve my problem but this does not work.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    CGFloat height = self.tableView.frameHeight - self.navigationController.navigationBar.frameHeight - [UIApplication sharedApplication].statusBarFrame.size.height - (self.rowCount * self.rowHeight);
    self.tableView.tableHeaderView.frameHeight = height / 2.0;
}

So I subtracted the height of the navigationBar & statusBar and cells' height to the tableView's height to get the height of the empty area. Now that I get the height if the empty area, I divided it to 2 for the footer and header's view.


Solution

  • In the viewWillAppear and in the didRotateFromInterfaceOrientation functions :

    CGFloat headerHeight = (self.view.frame.size.height - (ROW_HEIGHT * [self.tableView numberOfRowsInSection:0]))) / 2;
    
    self.tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, -headerHeight, 0);
    

    This will solve your problem.

    EDIT

    Call the updateTableViewContentInset function in the viewWillLayoutSubviews and after each reloadData :

    Ojective-C

    - (void)updateTableViewContentInset {
        CGFloat viewHeight = self.view.frame.size.height;
        CGFloat tableViewContentHeight = self.tableView.contentSize.height;
        CGFloat marginHeight = (viewHeight - tableViewContentHeight) / 2.0;
    
        self.tableView.contentInset = UIEdgeInsetsMake(marginHeight, 0, -marginHeight, 0);
    }
    

    Swift 4

    func updateTableViewContentInset() {
        let viewHeight: CGFloat = view.frame.size.height
        let tableViewContentHeight: CGFloat = tableView.contentSize.height
        let marginHeight: CGFloat = (viewHeight - tableViewContentHeight) / 2.0
    
        self.tableView.contentInset = UIEdgeInsets(top: marginHeight, left: 0, bottom:  -marginHeight, right: 0)
    }