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

时间:2015-04-16 20:14:49

标签: ios objective-c uitableview autolayout uistoryboard

我无法使用自动布局将一个视图放在故事板中作为UITableView的tableHeaderView子视图的中心。

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

enter image description here

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

enter image description here

黄色视图显然不居中。然而,"过滤器"底部的按钮是。

我知道使用自动布局和故事板以及表格标题视图来获得正确的高度是非常棘手的(你可以看到红色视图的高度肯定是不正确的),但此时,我&#39 ;我只是试图解决水平居中的黄色视图。

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

检查表格标题视图,所有子视图都启用了自动调整大小视图:

Xcode screenshot showing Autoresize Subviews checkbox

您还可以通过将表重新设置为同一视图来强制表重新呈现标题视图:

[self.tableView setTableHeaderView:self.outletToHeaderView];

更新:要调整表标题视图的大小,请在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]

答案 2 :(得分:0)

您需要在表视图中使用原型单元,而不是使用可重用标识符将其取消并将其返回给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
}

<强> UPD: 对不起,我的例子是用Swift编写的。但是很容易理解如何在Obj-C中做同样的事情

答案 3 :(得分:0)

在你的文件TableViewHeader中:

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