更改UITableView节标题的字体大小

JRD*_*RD8 131 objective-c uitableview ios swift uitableviewsectionheader

有人可以告诉我最简单的方法来更改UITableView部分标题中文本的字体大小吗?

我使用以下方法实现了部分标题:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
Run Code Online (Sandbox Code Playgroud)

然后,我了解如何使用此方法成功更改节标题高度:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
Run Code Online (Sandbox Code Playgroud)

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何实际增加部分标题文本的字体大小 - 或者字体样式?

有人可以帮忙吗?谢谢.

Mar*_*sel 353

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

下面的示例更改了字体,并且还在单元格中垂直和水平居中标题文本.请注意,您还应该响应heightForHeaderInSection在表视图的布局中对标题高度进行任何更改.(也就是说,如果您决定在此willDisplayHeaderView方法中更改标题高度.)

然后,您可以响应该titleForHeaderInSection方法,以使用不同的节标题重用此配置的标头.

Objective-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;
}
Run Code Online (Sandbox Code Playgroud)

Swift 1.2

(注意:如果您的视图控制器是a的后代,则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
}
Run Code Online (Sandbox Code Playgroud)

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.frame
    header.textLabel?.textAlignment = .center
}
Run Code Online (Sandbox Code Playgroud)

  • 我见过的最佳答案. (6认同)
  • 对我来说,这种方法比上面的方法好得多 (3认同)
  • 这不会调整标题视图的大小,因此如果您的字体较大或显着不同,例如Zapfino(不要问为什么),它会将文本剪切掉.如果你必须自己计算尺寸,那就太乱了,你不应该这样做. (3认同)
  • 假设没有其他原因可以进行子类化(例如添加视图),这将是调整信息的"正确"方式.此外,此方法可用于更新动态类型的标题文本.只需使用:`header.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];`和/或`header.detailTextLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];`以及所需的其他步骤(参见此处:http:// captechconsulting.com/blog/john-szumski/ios-7-tutorial-series-dynamic-type) (2认同)

mos*_*337 112

不幸的是,您可能必须覆盖此:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
Run Code Online (Sandbox Code Playgroud)

尝试这样的事情:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个正确的解决方案,但要小心这种方法.对于长于一行的标题,您必须在`tableView:heightForHeaderInSection:`中执行标题高度的计算,这可能很麻烦. (4认同)
  • 尝试这一点,如果您向上滚动表格,它会起作用,标题标签会停留在屏幕上并覆盖单元格.:( (3认同)
  • @trss我想你会发现这不是预期的行为.我不是在谈论停留在那里的标题部分,只是标签,并且当它们从它下面经过时它的超强加在细胞上,使它看起来真的很乱.我确实找到了一种更好的方法来实现这一点,并在我再次找到它后将其发回. (2认同)

Leo*_*ica 92

虽然mosca1337的答案是正确的解决方案,但要小心这种方法.对于文本长于一行的标题,您必须执行标题高度的计算,tableView:heightForHeaderInSection:其中可能很麻烦.

一个更受欢迎的方法是使用外观API:

[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont boldSystemFontOfSize:28]];
Run Code Online (Sandbox Code Playgroud)

这将改变字体,同时仍然离开桌子来管理高度本身.

为获得最佳结果,请将表视图子类化,并将其添加到包含链(in appearanceWhenContainedIn:)中,以确保仅针对特定表视图更改字体.

  • **Swift 3**:`UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)` (5认同)
  • 这不会正确调整标签大小以适应iOS 11上的字体.此外,在加载视图后向上和向下滚动会将它们重置为默认字体. (3认同)
  • 此解决方案会导致计算实际页脚/标题大小的许多错误.我可以在设置自定义字体时剪切标题时显示一些示例. (2认同)

Mar*_*ria 24

对于iOS 7,我使用这个,


-(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];
}
Run Code Online (Sandbox Code Playgroud)

这是带有标题大小调整的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          
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不会调整标题视图的大小以适应新字体. (6认同)

jef*_*igy 17

斯威夫特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)
    }
}
Run Code Online (Sandbox Code Playgroud)


Ell*_*ies 8

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
  }
Run Code Online (Sandbox Code Playgroud)
  1. 更改默认标题(保留默认值).

实现willDisplayHeaderView,如下所示:

  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)
    }
  }
Run Code Online (Sandbox Code Playgroud)

请记住:如果您使用的是静态单元格,由于UITableView的顶部,第一个部分标题的填充高于其他部分标题; 解决这个问题:

实现heightForHeaderInSection,如下所示:

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

    return 30.0 // Or whatever height you want!
  }
Run Code Online (Sandbox Code Playgroud)


Sre*_*h G 5

就是这样,你必须遵循这里写一些方法。#斯威夫特 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
}
Run Code Online (Sandbox Code Playgroud)

祝你好运