无法使用自动布局和故事板在 tableHeaderView 中居中视图

Can't center views in tableHeaderView with auto layout and storyboards

我无法在使用自动布局的情节提要中将作为 UITableView tableHeaderView 的子视图放置的视图居中。

在故事板中,我有一个 UITableView。我将 UIView(红色视图)拖到顶部,松开,它会自动创建一个 table header 视图。然后我将另一个 UIView(黄色视图)拖放到 table header 视图之上,调整大小并应用一些约束以确保它保持居中:

当我在模拟器上 运行 应用程序时,这是我得到的:

黄色视图明显没有居中。但是,底部的"Filter"按钮是。

我知道使用自动布局和情节提要和 table header 视图很难获得正确的高度(你可以看到红色视图的高度肯定是不正确的),但是在这一点,我只是想解决水平居中我的黄色视图。

我是否可以在我的故事板中设置所有这些而无需在代码中配置我的约束?

您需要使用来自 table 视图的原型单元格,而不是使用可重复使用的标识符将其出列,并 return 它是 contentView。只有这样才能成功

var headerView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()
    self.headerView = (self.tableView.dequeueReusableCellWithIdentifier("CustomHeaderCell") as! UITableViewCell).contentView
}

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    return self.headerView
}

更新: 哦不好意思,我的例子是写在Swift里的。但是很容易理解如何在 Obj-C

中做同样的事情

检查 table header 视图,所有子视图都启用了自动调整子视图大小:

您还可以通过 re-setting 强制 table 到 re-render 与 header 相同的视图:

[self.tableView setTableHeaderView:self.outletToHeaderView];

更新:调整table header视图的大小,在viewWillAppear:

中给它一个合适的框架
CGRect newFrame = self.outletToHeaderView.frame;
newFrame.size.width = self.tableView.bounds.size.width;
newFrame.size.height = 44;
[self.outletToHeaderView setFrame:newFrame];
// Then reset it to force the table view to re-render/accommodate
[self.tableView setTableHeaderView:self.outletToHeaderView]

确保您的 UITableView 具有针对其父视图设置的前导、尾随、底部、顶部约束。

在您的文件 TableViewHeader 中:

override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        yourView.translatesAutoresizingMaskIntoConstraints = false
        yourView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
    }