UITableView content height

前端 未结 4 987
南方客
南方客 2021-01-13 09:02

I have a UITableView that is set to not enable scrolling, and it exists in a UIScrollView. I\'m doing it this way as the design specs call for something that looks like a t

相关标签:
4条回答
  • 2021-01-13 09:15

    A more general solution that works for me:

    CGFloat tableViewHeight(UITableView *tableView) {
        NSInteger lastSection = tableView.numberOfSections - 1;
        while (lastSection >= 0 && [tableView numberOfRowsInSection:lastSection] <= 0)
            lastSection--;
        if (lastSection < 0)
            return 0;
        CGRect lastFooterRect = [tableView rectForFooterInSection:lastSection];
        return lastFooterRect.origin.y + lastFooterRect.size.height;
    }
    

    In addition to Andrei's solution, it accounts for empty sections and section footers.

    0 讨论(0)
  • 2021-01-13 09:18

    UITableView is a subclass of UIScrollView, so it has a contentSize property that you should be able to use no problem:

    CGFloat tableViewContentHeight = tableView.contentSize.height;
    scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, tableViewContentHeight);
    

    However, as several other SO questions have pointed out, when you make an update to a table view (like inserting a row), its contentSize doesn't appear to be updated immediately like it is for most other animated resizing in UIKit. In this case, you may need to resort to something like Michael Manner's answer. (Although I think it makes better sense implemented as a category on UITableView)

    0 讨论(0)
  • 2021-01-13 09:19

    You can run over the sections and use the rectForSection to calculate the total height (this included footer and header as well!). In swift I use the following extension on UITableView

    extension UITableView {
        /**
         Calculates the total height of the tableView that is required if you ware to display all the sections, rows, footers, headers...
         */
        func contentHeight() -> CGFloat {
            var height = CGFloat(0)
            for sectionIndex in 0..<numberOfSections {
                height += rectForSection(sectionIndex).size.height
            }
            return height
        }
    
    }
    
    0 讨论(0)
  • 2021-01-13 09:32

    Use

    CGRect lastRowRect= [tableView rectForRowAtIndexPath:index_path_for_your_last_row];
    CGFloat contentHeight = lastRowRect.origin.y + lastRowRect.size.height;
    

    You can then use the contentHeight variable to set the contentSize for the scrollView.

    0 讨论(0)
提交回复
热议问题