我希望将我在UITableView
的内容集中在一起,其中包含在故事板上创建的headerView
和footerView
以及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为页脚和标题的视图。
答案 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}}属性,即您不必考虑单元格UITableView
或height
。
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)
}
结果:
答案 7 :(得分:-1)