如何在UITableView中设置表格标题的高度?


77

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

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

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

并使用以下委托设置节的页眉/页脚高度。

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

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

谢谢。


1
如果返回0,则不起作用;但是当我返回0.1f时,它确实对我
有用

Answers:


65

只需设置tableHeaderView的frame属性。


我已经做到了。我将图片设置为tableheaderview。无法更改表格标题的高度。事情是HeaderImaze尺寸为640x88,它被重新调整为320x88这是不对的,所以我想我的表头的高度设置为44时,指定的图像分辨率宽度为640
applefreak

1
您好罗杰,我认为您的想法应该可行。我尝试使用“ plainTableView.tableHeaderView.frame = CGRectMake(0,0,320,44);”设置框架属性。但是什么也没发生。请注意,如果我的图像尺寸为640x88,则将其分配给tableHeaderView。
applefreak 2011年

以下对我有用。我无法更改桌子的高度,但是我重置了图像的高度。if(headerImage.bounds.size.width == 640)[headerImage setFrame:CGRectMake(0,0,headerImage.bounds.size.width,headerImage.bounds.size.height / 2)];
applefreak 2011年

62

我发现了一个不错的技巧。修改框架属性后添加以下行

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

诀窍是(我认为)当您将视图分配给tableHeaderView属性时,UITableView正在缓存高度(实际上是框架)。上一行只是再次指定了高度。


但是,如果尝试为更改设置动画,它似乎只能在缩小的方向上起作用。
古杰明2013年

1
是否动画,这是最快的解决方案。完美的:)
iPhoneNoob '16

不敢相信这是解决方案!它可以使标题变小和变大。对于Swift,我正在做-tableView.tableHeaderView!.frame = CGRectMake(0,0,self.view.frame.size.width,100)tableView.tableHeaderView = self.tableView.tableHeaderView
Michael McKenna

39
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
}

更多细节可以在这里找到


1
太棒了 非常感谢Kris。您的函数在viewDidAppear中仍然可以很好地工作。它将比多次调用的viewDidLayoutSubviews更好。
truongky '16

1
@truongky不,viewDidLayoutSubviews将在旋转或窗口调整大小(例如iPad分割屏幕)上工作,需要调整大小之后,viewWill / DidAppear将永远不会更新它,并且它将显示错误。
Vive

2
从iOS 12.4开始,由于无休止的版面设计循环,这导致了冻结
Trev14

10

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

self.tableView.tableHeaderView 

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

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

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

它应该工作。


7

仅当我首先将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是一个强引用,以防止释放页脚视图


self.searchTableView.tableFooterView = self.searchTableView.tableFooterView;也可以。
superarts.org

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))
}

最好的答案
米哈尔Ziobro

2
好的解决方案,但是那“ tblView”真是一拳!:'D
亚历山德罗·弗朗奇

2

只需使用构造函数创建Footer Wrapper View,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()并分配框架属性,它也可能不起作用。


2

如果在IB中将视图添加为表标题视图,请在选项卡5(大小检查器)的IB中设置该视图的框架


1

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


1

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

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

另外,例如,您可以分配平移转换以将图像放置在其容器标题视图的中间。


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根据此链接回答的操作

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


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

0

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

尺寸检查头


-1

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

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

或者如果标头的高度不同,请继续实施:

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

OP要求tableView标头,而不是节标头;)
爬升

-1

如果更改了tableView的headerView的高度,只需重置headerView的框架,然后重置tableView的headerView:

self.headerView.frame = newFrame;
self.tableView.tableHeaderView = self.headerView;

这远远超出了要求。不要将其用于如此简单的任务。如果您要描述的话,简单的setNeedsLayout就足够了。
Vive

-2

使用表格视图默认属性:

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

谢谢


1
不,这是行不通的。我尝试过这个。它仅更改表页眉/页脚的大小,而不更改表页眉/页脚的大小。我想念什么吗?
applefreak 2011年

42
我们不讨论SEction标头。这是关于tableView标头的
iSaalis

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

或者你也可以这样使用

tableView.estimatedSectionHeaderHeight 

我们不讨论SEction标头。它是关于tableView标头的
亚瑟·加尔萨

我将节的页眉和页脚用作表的页眉和页脚。因此,这对我有效,对您有所帮助。我发现它比其他解决方案更容易。
David J
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.