如何垂直对齐(居中)UITableView的内容?

时间:2015-07-30 11:38:21

标签: ios objective-c xcode uitableview storyboard

我希望将我在UITableView的内容集中在一起,其中包含在故事板上创建的headerViewfooterView以及UITableViewCell s。我怎样才能做到这一点?

以下是我试图解决问题的方法,但这不起作用。

- (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;
}

所以我减去了navigationBar&的高度。 statusBar和cells'高度到tableView的高度,以获得空白区域的高度。 现在我得到了空白区域的高度,我将其分为2为页脚和标题的视图。

8 个答案:

答案 0 :(得分:26)

viewWillAppear didRotateFromInterfaceOrientation 函数中:

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

self.tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, -headerHeight, 0);

这将解决您的问题。

修改

viewWillLayoutSubviews 中调用 updateTableViewContentInset 函数,并在每次 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)
}

答案 1 :(得分:4)

覆盖viewDidLayoutSubviews并将tableView的frame与它的contentSize比较以设置其contentInset。在Swift 4中:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let tableViewHeight = self.tableView.frame.height
    let contentHeight = self.tableView.contentSize.height

    let centeringInset = (tableViewHeight - contentHeight) / 2.0
    let topInset = max(centeringInset, 0.0)

    self.tableView.contentInset = UIEdgeInsets(top: topInset, left: 0.0, bottom: 0.0, right: 0.0)
}

这适用于自定义表格视图单元格

答案 2 :(得分:2)

使用contentSize的{​​{1}}属性,即您不必考虑单元格UITableViewheight

count

在重新加载- (void) updateTableInsetsForHeight: (CGFloat) height { CGFloat tableViewInset = MAX((height - self.tableView.contentSize.height) / 2.0, 0.f); self.tableView.contentInset = UIEdgeInsetsMake(tableViewInset, 0, -tableViewInset, 0); } - 数据后,以及contentInsets的包含视图变为可见(tableView)以及何时更改大小({{1}时更新tableView }})。

viewWillAppear:

答案 3 :(得分:2)

Swift 3基于Pipiks回答

let headerHeight: CGFloat = (view.frame.size.height - CGFloat(Int(tableView.rowHeight) * tableView.numberOfRows(inSection: 0))) / 2
tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, -headerHeight, 0)

答案 4 :(得分:0)

在故事板中,在UIView的顶部添加TableView(UIView应该是您的TableView的父级)。之后设置其约束来填充视图。现在,设置TableView的大小并将其约束设置为垂直和水平居中 UIView。这将解决您的问题。

答案 5 :(得分:0)

我发现导致我的计算错误的原因。 self.tableView.bounds.size.height的值与viewWillAppear中的实际高度不同。我改为使用了self.view.bounds.size.height。

答案 6 :(得分:0)

SWIFT 3:

var headerHeight: CGFloat = (tableView.frame.size.height - CGFloat(Int(tableView.rowHeight) * tableView.numberOfRows(inSection: 0))) / 2
if headerHeight > 0 {
    tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, 0/*-headerHeight*/, 0)
} else {
    headerHeight = 0
    tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, 0/*-headerHeight*/, 0)
}

结果:

enter image description here enter image description here enter image description here enter image description here

答案 7 :(得分:-1)

像这样设置UITableView的框架

CGFloat width = self.view.frame.size.width;
CGFloat height = self.view.frame.size.height;
CGFloat tableHeight = 200.0; //your table height
self.tableView.frame = CGRectMake(0,(height-tableHeight)/2,width,tableHeight);

或试试这个

enter image description here