如何在UITableView中设置表头的高度?

时间:2011-04-07 12:36:59

标签: iphone uitableview

我已经浏览了有关UITableView类和委托引用的Apple文档,但无法找到明确设置表头高度的方法。

我使用以下委托设置表格单元格高度:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

并使用以下代理设置节头/页脚高度。

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section

有人可以帮我设置表格页眉/页脚高度吗?

感谢。

17 个答案:

答案 0 :(得分:59)

只需设置tableHeaderView的frame属性。

答案 1 :(得分:57)

我找到了一个很好的黑客。修改框架属性后添加以下行

self.tableView.tableHeaderView = self.tableView.tableHeaderView;

诀窍是(我认为)当你将视图分配给tableHeaderView属性时,UITableView正在缓存高度(实际上是帧)。上面这行只是重新分配了高度。

答案 2 :(得分:33)

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    sizeHeaderToFit()
}

private func sizeHeaderToFit() {
    let headerView = tableView.tableHeaderView!

    headerView.setNeedsLayout()
    headerView.layoutIfNeeded()

    let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
    var frame = headerView.frame
    frame.size.height = height
    headerView.frame = frame

    tableView.tableHeaderView = headerView
}

可以找到更多详细信息here

答案 3 :(得分:9)

如果您仍然需要它,您是否尝试过设置属性

self.tableView.tableHeaderView 

如果您计算所需的高度,并为tableHeaderView设置新视图:

CGRect frame = self.tableView.tableHeaderView.frame;
frame.size.height = newHeight;

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:frame];

它应该有用。

答案 4 :(得分:6)

只有当我将tableview的页脚/标题设置为nil时才能与我合作:

self.footer = self.searchTableView.tableFooterView;
CGRect frame = self.footer.frame;
frame.size.height = 200;
self.footer.frame = frame;
self.searchTableView.tableFooterView = nil;
self.searchTableView.tableFooterView = self.footer;

确保self.footer是一个强大的参考,以防止页脚视图被解除分配

答案 5 :(得分:4)

Swift 4 - 您可以使用HEIGHT_VIEW管理身高,只需添加此鳕鱼,其工作

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let HEIGHT_VIEW = 60
    tableView.tableFooterView?.frame.size = CGSize(width: tblView.frame.width, height: CGFloat(HEIGHT_VIEW))

    tableView.tableHeaderView?.frame.size = CGSize(width:tblView.frame.width, height: CGFloat(HEIGHT_VIEW))
}

答案 6 :(得分:2)

使用构造函数UIView(frame:_)创建页脚包装器视图 然后,如果您正在为FooterView使用xib文件,请从xib创建视图并将其作为subView添加到包装器视图。然后将包装器分配给tableView.tableFooterView = fixWrapper

    let fixWrapper = UIView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 54)) // dont remove
    let footer = UIView.viewFromNib("YourViewXibFileName") as! YourViewClassName
    fixWrapper.addSubview(footer)
    tableView.tableFooterView = fixWrapper
    tableFootterCostView = footer

它对我来说很完美!重点是使用构造函数(frame:_)创建页脚视图。即使您创建了UIView()并指定了frame属性,它也可能不起作用。

答案 7 :(得分:1)

@kris答案对我在Objective-C中需要它的人很有帮助。

这是代码

-(void)viewDidLayoutSubviews{
     [super viewDidLayoutSubviews];
     [self sizeHeaderToFit];
}

-(void)sizeHeaderToFit{
     UIView *headerView = self.tableView.tableHeaderView;
     [headerView setNeedsLayout];
     [headerView layoutIfNeeded];
     CGFloat height = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
     CGRect frame = headerView.frame;
     frame.size.height = height;
     headerView.frame = frame;
     self.tableView.tableHeaderView = headerView;
}

答案 8 :(得分:1)

如果您以编程方式设置tableHeaderView,则只需将其设置在viewDidLayoutSubviews内即可。

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        setupTableViewHeader()
    }

    private func setupTableViewHeader() {
        // Something you do to set it up programatically...
        tableView.tableHeaderView = MyHeaderView.instanceFromNib() 
    }

如果您未通过编程方式进行设置,则需要执行类似@Kris基于此link的回答

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        sizeHeaderToFit()
    }

    private func sizeHeaderToFit() {
        if let headerView = tableView.tableHeaderView {
            headerView.setNeedsLayout()
            headerView.layoutIfNeeded()

            let height = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
            var frame = headerView.frame
            frame.size.height = height
            headerView.frame = frame

            tableView.tableHeaderView = headerView
        }
    }

答案 9 :(得分:1)

您可以创建具有所需高度(宽度应为UITableView的高度)的UIView,并在其中放置具有适当尺寸图片的UIImageView:它们不会自动拉伸。

您还可以通过为容器视图提供更高的高度,在内部UIImageView的上方和下方提供边距。

例如,您还可以分配一个“转换”转换,以将图像放置在其容器标题视图的中间。

答案 10 :(得分:1)

如果您将XIB用于tableView的主headerView,则可以将XIB设置为自由格式,并根据需要设置高度,然后单击Autoresizing的顶部,底部块和上部,下部箭头,仅选择水平块。我在上面提到过。

答案 11 :(得分:1)

如果在IB中添加视图作为表标题视图,请在标签5(尺寸检查器)中的IB中设置该视图的框架

答案 12 :(得分:0)

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
}

或者您也可以这样使用

tableView.estimatedSectionHeaderHeight 

答案 13 :(得分:0)

在XCode 10中,您可以从“大小检查器”选项卡中设置较高的节的页眉和页脚

Size Inspector header

答案 14 :(得分:-1)

使用自动布局,您可以执行以下操作:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = <your-header-height>

或者如果您的标题高度不同,请继续执行:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return <your-header-height>
}

答案 15 :(得分:-1)

如果您更改了tableView的headerView的高度,只需使用这些代码来更新tableView:

Objc:

[tableView beginUpdates];
tableView.endUpdates()

夫特:

tableView.beginUpdates()
tableView.endUpdates()

答案 16 :(得分:-1)

使用表格视图默认属性:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 35.0;
}

由于