更改 UITableView 节头的字体大小

有人能告诉我在 UITableView 部分标题中改变文本字体大小的最简单方法吗?

我使用以下方法实现了章节标题:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

然后,我了解了如何使用这种方法成功地改变节头高度:

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

我使用这种方法填充了 UITableView 单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

然而,我卡在如何实际增加字体大小-或者就此而言的字体风格-的章节标题文本?

有人能帮忙吗,谢谢。

112186 次浏览

不幸的是,您可能不得不覆盖以下内容:

目标 C:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

斯威夫特:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

试试这样:

目标 C:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {


UILabel *myLabel = [[UILabel alloc] init];
myLabel.frame = CGRectMake(20, 8, 320, 20);
myLabel.font = [UIFont boldSystemFontOfSize:18];
myLabel.text = [self tableView:tableView titleForHeaderInSection:section];


UIView *headerView = [[UIView alloc] init];
[headerView addSubview:myLabel];


return headerView;
}

斯威夫特:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {


let myLabel = UILabel()
myLabel.frame = CGRect(x: 20, y: 8, width: 320, height: 20)
myLabel.font = UIFont.boldSystemFont(ofSize: 18)
myLabel.text = self.tableView(tableView, titleForHeaderInSection: section)


let headerView = UIView()
headerView.addSubview(myLabel)


return headerView
}

Mosca1337的答案是正确的,但要小心使用这种方法。对于文本长于一行的标题,必须在 tableView:heightForHeaderInSection:中执行标题高度的计算,这可能很麻烦。

一个更好的方法是使用外观 API:

[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont boldSystemFontOfSize:28]];

这将更改字体,同时仍留下表来管理高度本身。

为获得最佳结果,对表视图进行子类化,并将其添加到包含链(在 appearanceWhenContainedIn:中)中,以确保只为特定的表视图更改字体。

另一种方法是响应 UITableViewDelegate方法 willDisplayHeaderView。传递的视图实际上是 UITableViewHeaderFooterView的一个实例。

下面的示例更改字体,并将标题文本垂直和水平地集中在单元格中。请注意,您还应该响应 heightForHeaderInSection,以便在表视图的布局中考虑标头高度的任何更改。(也就是说,如果您决定在此 willDisplayHeaderView方法中更改标头高度。)

然后,您可以响应 titleForHeaderInSection方法,以使用不同的节标题重用这个配置的标头。

目标 C

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;


header.textLabel.textColor = [UIColor redColor];
header.textLabel.font = [UIFont boldSystemFontOfSize:18];
CGRect headerFrame = header.frame;
header.textLabel.frame = headerFrame;
header.textLabel.textAlignment = NSTextAlignmentCenter;
}

Swift 1.2

(注意: 如果您的视图控制器是 UITableViewController的后代,则需要将其声明为 override func。)

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)
{
let header:UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView


header.textLabel.textColor = UIColor.redColor()
header.textLabel.font = UIFont.boldSystemFontOfSize(18)
header.textLabel.frame = header.frame
header.textLabel.textAlignment = NSTextAlignment.Center
}

Swift 3.0

这段代码还可以确保当你的页眉视图不是 UITableViewHeaderFooterView 时,应用程序不会崩溃:

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
guard let header = view as? UITableViewHeaderFooterView else { return }
header.textLabel?.textColor = UIColor.red
header.textLabel?.font = UIFont.boldSystemFont(ofSize: 18)
header.textLabel?.frame = header.bounds
header.textLabel?.textAlignment = .center
}

对于 iOS7我使用这个,


-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;


header.textLabel.font = [UIFont boldSystemFontOfSize:10.0f];
header.textLabel.textColor = [UIColor orangeColor];
}

下面是 Swift 3.0版本的头部大小调整

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let header = view as? UITableViewHeaderFooterView {
header.textLabel!.font = UIFont.systemFont(ofSize: 24.0)
header.textLabel!.textColor = UIColor.orange
}
}

Swift 2.0 :

  1. 用完全可定制的 UILabel 替换默认节头。

实现 viewForHeaderInSection,如下所示:

  override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {


let sectionTitle: String = self.tableView(tableView, titleForHeaderInSection: section)!
if sectionTitle == "" {
return nil
}


let title: UILabel = UILabel()


title.text = sectionTitle
title.textColor = UIColor(red: 0.0, green: 0.54, blue: 0.0, alpha: 0.8)
title.backgroundColor = UIColor.clearColor()
title.font = UIFont.boldSystemFontOfSize(15)


return title
}
  1. 更改默认标头(保留默认值)。

实现 will DisplayHeaderView,如下所示:

  override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {


if let view = view as? UITableViewHeaderFooterView {
view.backgroundView?.backgroundColor = UIColor.blueColor()
view.textLabel!.backgroundColor = UIColor.clearColor()
view.textLabel!.textColor = UIColor.whiteColor()
view.textLabel!.font = UIFont.boldSystemFontOfSize(15)
}
}

请记住: 如果使用静态单元格,第一个节标题由于位于 UITableView 的顶部而被填充得比其他节标题更高; 为了解决这个问题:

使用 heightforHeaderInSection,如下所示:

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


return 30.0 // Or whatever height you want!
}

斯威夫特2:

按照 OP 的要求,只有调整大小,而不是设置为系统粗体或其他什么:

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let headerView = view as? UITableViewHeaderFooterView, textLabel = headerView.textLabel {


let newSize = CGFloat(16)
let fontName = textLabel.font.fontName
textLabel.font = UIFont(name: fontName, size: newSize)
}
}

斯威夫特3:

调整 只有大小的最简单方法:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {


let header = view as! UITableViewHeaderFooterView


if let textlabel = header.textLabel {
textlabel.font = textlabel.font.withSize(15)
}
}

使用这种方法,您也可以设置 字体大小、字体样式和标题背景。 这里有两个方法

第一种方法

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section{
UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
header.backgroundView.backgroundColor = [UIColor darkGrayColor];
header.textLabel.font=[UIFont fontWithName:@"Open Sans-Regular" size:12];
[header.textLabel setTextColor:[UIColor whiteColor]];
}

第二种方法

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 30)];
//    myLabel.frame = CGRectMake(20, 8, 320, 20);
myLabel.font = [UIFont fontWithName:@"Open Sans-Regular" size:12];
myLabel.text = [NSString stringWithFormat:@"   %@",[self tableView:FilterSearchTable titleForHeaderInSection:section]];


myLabel.backgroundColor=[UIColor blueColor];
myLabel.textColor=[UIColor whiteColor];
UIView *headerView = [[UIView alloc] init];
[headerView addSubview:myLabel];
return headerView;
}

Swift 4 版本的 Leo Natan 回答

UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)

如果要设置自定义字体,可以使用

if let font = UIFont(name: "font-name", size: 12) {
UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = font
}

这就是我对雨燕5号的解决方案。

要完全控制 Header 部分视图,需要在控制器中使用 tableView (: viewForHeaderInsection: :)方法,如前面的文章所示。然而,还有更进一步的步骤: 为了提高性能,Apple 建议不要每次都生成新的视图,而是重用标题视图,就像重用表单元格一样。这是通过 tableView.dequeue eReusableHeaderFooterView (withIdentifier:)方法实现的。但是我遇到的问题是,一旦你开始使用这个重用函数,字体的功能将不如预期。其他事情,如颜色,对齐所有罚款,但只是字体。有一些讨论,但我让它像下面这样工作。

问题是 tableView.dequeue eReusableHeaderFooterView (withIdentifier:)不像 tableView.dequeneReuseCell (:)总是返回单元格。如果没有人可用,前者将返回0。即使它返回一个重用头视图,它也不是您的原始类类型,而是一个 UITableHeaderFooterView。因此,您需要根据自己的代码做出判断并采取行动。基本上,如果它为空,就会得到一个全新的头视图。如果不是零,则强制施放,以便您可以控制。

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let reuse_header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "yourHeaderID")
if (reuse_header == nil) {
let new_sec_header = YourTableHeaderViewClass(reuseIdentifier:"yourHeaderID")
new_section_header.label.text="yourHeaderString"
//do whatever to set color. alignment, etc to the label view property
//note: the label property here should be your custom label view. Not the build-in labelView. This way you have total control.
return new_section_header
}
else {
let new_section_header = reuse_section_header as! yourTableHeaderViewClass
new_sec_header.label.text="yourHeaderString"
//do whatever color, alignment, etc to the label property
return new_sec_header}


}

在这里,你必须按照这里写一些方法。 # Swift 5

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    

let header = view as? UITableViewHeaderFooterView
header?.textLabel?.font = UIFont.init(name: "Montserrat-Regular", size: 14)
header?.textLabel?.textColor = .greyishBrown
}


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

return 26
}

祝你好运