Зміна розміру шрифту для заголовків розділів UITableView


139

Може хтось, будь ласка, доручить мені найпростіший спосіб змінити розмір шрифту для тексту в заголовку розділу UITableView?

У мене назви розділів реалізовані за допомогою наступного методу:

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

Потім я розумію, як успішно змінити висоту заголовка розділу за допомогою цього методу:

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

У мене заселені клітини UITableView за допомогою цього методу:

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

Однак я застряг у тому, як насправді збільшити розмір шрифту - або, з цього приводу, стиль шрифту - тексту заголовка розділу?

Може хтось, будь ласка, допоможе? Дякую.


Відповіді:


118

На жаль, можливо, вам доведеться це перекрити:

В Objective-C:

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

У Свіфті:

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

Спробуйте щось подібне:

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

1
Дякую. Це спрацювало чудово. Цінується.
JRD8

5
Хоча це правильне рішення, будьте обережні з цим методом. Для заголовка, що перевищує один рядок, вам доведеться виконати обчислення висоти заголовка, в tableView:heightForHeaderInSection:якій може бути громіздко.
Лев Натан

3
Спробувавши це, і якщо це працює, якщо прокрутити таблицю вгору, ярлик заголовка залишається на екрані і накладає комірки. :(
Плазма

2
@trss Я вважаю, що це не очікувана поведінка. Я не говорю про те, що там знаходиться заголовок, лише мітка, і її супер накладається на комірки, коли вони проходять під ним, і це виглядає справжнім безладом. Я знайшов кращий спосіб досягти цього і відправлю його, як тільки знову знайду його.
Плазма

1
@ mosca1337 немає потреби в створенні іншого перегляду, ви можете отримати фактичне відображення "UITableViewHeaderFooterView" та відрегулювати параметри.
Хуан Боеро

368

Ще один спосіб зробити це - відповісти на UITableViewDelegateметод willDisplayHeaderView. Переданий вид - це фактично екземпляр a UITableViewHeaderFooterView.

Наведений нижче приклад змінює шрифт, а також центрирує текст заголовка вертикально та горизонтально всередині комірки. Зауважте, що ви також повинні відповісти, щоб heightForHeaderInSectionбудь-які зміни у висоті заголовка були враховані в макеті подання таблиці. (Тобто, якщо ви вирішили змінити висоту заголовка в цьому willDisplayHeaderViewметоді.)

Потім ви можете відповісти на titleForHeaderInSectionметод повторного використання цього налаштованого заголовка з різними заголовками розділів.

Ціль-С

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

Швидкий 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.frame
    header.textLabel?.textAlignment = .center
}

3
Цей метод спрацював для мене набагато краще, ніж описаний вище
Плазма

6
Найкраща відповідь, яку я бачив.
phatmann

2
Це був би "правильний" спосіб коригування інформації, припускаючи, що немає інших підстав для підкласу (наприклад, додавання поглядів, наприклад). Крім того, цей метод можна використовувати для оновлення тексту заголовка для Dynamic Type. Просто використовуйте: header.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];та / або header.detailTextLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];разом з іншими необхідними кроками (див. Тут: captechconsulting.com/blog/john-szumski/… )
leanne

3
Це не змінює розмір перегляду заголовка, тому якщо ваш шрифт більший або значно відрізняється, наприклад, Zapfino (не запитуйте, чому), він виріже текст. Якщо вам доведеться розраховувати розмір самостійно, це безлад, і ви не повинні цього робити.
Лев Натан

@CocoaPriest Не відбувається збій у моїй бета-версії, тхо. (ГМ насіння 2)
Патрік Басут

96

Хоча відповідь mosca1337 є правильним рішенням, будьте обережні з цим методом. Для заголовка з текстом довше, ніж один рядок, вам доведеться виконати обчислення висоти заголовка, в tableView:heightForHeaderInSection:якій може бути громіздко.

Набагато кращим методом є використання API зовнішнього вигляду:

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

Це змінить шрифт, поки залишаючи таблицю для керування висотами.

Для оптимальних результатів підкласуйте подання таблиці та додайте його до ланцюга (in appearanceWhenContainedIn:) вмісту, щоб переконатися, що шрифт змінено лише для конкретних представлень таблиць.


1
Якщо підкласифікація, то ви все одно повернете спеціальний вид - tableView:viewForHeaderInSection:справа? У такому випадку шрифт можна встановити саме там. Це те, що рішення @ mosca1337 все одно робить.
trss

1
Ха-ха, ну я після вчорашнього дня вузол. Підкласируйте подання таблиці та додайте його до списку контейнерів. ;-)
Лев Натан

2
Це рішення викликає багато помилок при обчисленні реального розміру колонтитула / заголовка. Я можу показати кілька прикладів, коли заголовки вирізаються під час налаштування спеціального шрифту.
kas-kad

5
Свіфт 3 :UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)
Ерік Ходгінс

3
Це не дозволяє змінити розмір мітки відповідно до шрифту на iOS 11. Крім того, прокручування вгору та вниз після завантаження поглядів скидає їх до шрифту за замовчуванням.
nickdnk

25

Для 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];
}

Ось версія 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          
    }
}

6
Це не дозволить розміру розміру заголовка відповідно до нового шрифту.
Лев Натан

@LeoNatan Як ми можемо розмістити перегляд заголовка відповідно до нового шрифту - чи можна це зробити за допомогою цього методу?
SAHM

Я хотів уточнити, що я бачив вашу вищезгадану відповідь, але я хочу змінити шрифт лише для обмеження розміру, коли вибраний користувачем шрифт (доступність) перевищує певний розмір (так, не весь час). Я вважаю, що мені потрібно перевірити та, можливо, змінити шрифт у willDisplayHeaderView, тож чи є спосіб я міг би перерахувати висоту перегляду, якщо шрифт буде змінено?
SAHM

19

Швидкий 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)
    }
}

Це найпростіший спосіб, який я шукаю.
Райан

Працює в швидкому 4! Не забувайте "переосмислити функцію .."
Матвій

8

Swift 2.0 :

  1. Замініть заголовок розділу за замовчуванням на повністю настроюваний UILabel.

Реалізуйте переглядForHeaderInSection, наприклад так:

  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. Змініть заголовок за замовчуванням (зберігає за замовчуванням).

Реалізуйте 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)
    }
  }

Пам'ятайте: якщо ви використовуєте статичні комірки, заголовок першого розділу розміщений вище, ніж інші заголовки розділів завдяки верхній частині UITableView; щоб виправити це:

Виконайте висотуForHeaderInSection, наприклад:

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

    return 30.0 // Or whatever height you want!
  }

4

Swift 4 версія Лео Натан відповідь є

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
}

На жаль, цей кадр не змінює розмір.
nickdnk

3

За допомогою цього методу ви також можете встановити розмір шрифту, стиль шрифту та фон заголовка . для цього є 2 методи

Перший метод

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

1

Швидкий 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)
        }
    }

0

Це моє рішення зі швидким 5.

Щоб повністю контролювати перегляд розділу заголовка, потрібно використовувати метод tableView (: viewForHeaderInsection: :) у своєму контролері, як показало попереднє повідомлення. Однак є ще один крок: для підвищення продуктивності Apple рекомендує не створювати новий вигляд кожного разу, а повторно використовувати подання заголовка, як і повторно використовувати осередок таблиці. Це методом tableView.dequeueReusableHeaderFooterView (withIdentifier:). Але проблема, яка у мене була, коли ви починаєте використовувати цю функцію повторного використання, шрифт не буде працювати так, як очікувалося. Інші речі, такі як колір, вирівнювання всіх тонких, але лише шрифт. Є деякі дискусії, але я змусив це працювати наступним чином.

Проблема - tableView.dequeueReusableHeaderFooterView (withIdentifier :) - це не так, як tableView.dequeneReuseCell (:), який завжди повертає комірку. Перший поверне нуль, якщо його немає. Навіть якщо він повертає перегляд повторного використання заголовка, це не ваш початковий тип класу, а 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}

    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.