UITableView - зміна кольору заголовка розділу


Відповіді:


393

Сподіваємось, цей метод із UITableViewDelegateпротоколу почне:

Завдання-C:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{
  UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];
  if (section == integerRepresentingYourSectionOfInterest)
     [headerView setBackgroundColor:[UIColor redColor]];
  else 
     [headerView setBackgroundColor:[UIColor clearColor]];
  return headerView;
}

Швидкий:

func tableView(_ tableView: UITableView!, viewForHeaderInSection section: Int) -> UIView!
{
  let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: 30))
  if (section == integerRepresentingYourSectionOfInterest) {
    headerView.backgroundColor = UIColor.redColor()
  } else {
    headerView.backgroundColor = UIColor.clearColor()
  }
  return headerView
}

Оновлено 2017 рік:

Швидкий 3:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
    {
        let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: 30))
        if (section == integerRepresentingYourSectionOfInterest) {
            headerView.backgroundColor = UIColor.red
        } else {
            headerView.backgroundColor = UIColor.clear
        }
        return headerView
    }

Замініть [UIColor redColor]тим, що UIColorхочете. Ви також можете скоригувати розміри headerView.


17
Це також може допомогти налаштувати розмір заголовка розділу за допомогою self.tableView.sectionHeaderHeight. В іншому випадку у вас можуть виникнути проблеми із переглядом тексту, який ви відображаєте для заголовка розділу.
Тоні Лензі

Чудово працює, [UIColor xxxColor]однак, коли я спробую користувальницький колір, подібний до тих, які я можу отримати з Photoshop (тому використовуючи UIColor red:green:blue:alpha:, він просто білий. Чи я щось роблю не так?
Matej

Залиште окреме питання, і ми спробуємо допомогти. Включити вихідний код.
Алекс Рейнольдс

12
Зауважте, що ця відповідь (хоча правильна) просто поверне UIView без вмісту.
Грег М. Крсак

7
Це досить застаріла інформація і просто створення іншого перегляду - не найкраща відповідь. Ідея полягає в тому, щоб отримати належний вигляд і змінити колір або відтінок на ньому. Відповідь нижче за допомогою willDisplayHeaderView - це набагато кращий підхід.
Олексій Заватоне

741

Це старе питання, але я думаю, що відповідь потрібно оновити.

Цей метод не передбачає визначення та створення власного власного представлення. В iOS 6 і новіших версіях ви можете легко змінити колір тла та колір тексту, визначивши

-(void)tableView:(UITableView *)tableView 
    willDisplayHeaderView:(UIView *)view 
    forSection:(NSInteger)section

метод делегування розділу

Наприклад:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    // Background color
    view.tintColor = [UIColor blackColor];

    // Text Color
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
    [header.textLabel setTextColor:[UIColor whiteColor]];

    // Another way to set the background color
    // Note: does not preserve gradient effect of original header
    // header.contentView.backgroundColor = [UIColor blackColor];
}

Взяте з моєї публікації тут: https://happyteamlabs.com/blog/ios-how-to-customize-table-view-header-and-footer-colors/

Швидкий 3/4

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){
    view.tintColor = UIColor.red
    let header = view as! UITableViewHeaderFooterView
    header.textLabel?.textColor = UIColor.white
}

2
Я не мав уявлення, що це навіть було додано до SDK. Блискуче! Абсолютно правильна відповідь.
JRod

1
ОП - Будь ласка, оновіть прийняту відповідь на цю. Набагато чистіше, ніж старі підходи.
Кайл Клегг

10
Це, здається, не працює для мене. Колір тексту працює, але не відтінок для фону заголовка. Я на iOS 7.0.4
zeeple

10
user1639164, ви можете використовувати header.backgroundView.backgroundColor = [UIColor blackColor]; щоб встановити відтінок для фону заголовка.
慭 慭 流 觞

2
@Kent минуло певний час, але для майбутніх людей ця header.contentView.backgroundColor = [UIColor blackColor];опція дасть вам непрозорий заголовок
SparkyRobinson

98

Ось як змінити колір тексту.

UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(10, 3, tableView.bounds.size.width - 10, 18)] autorelease];
label.text = @"Section Header Text Here";
label.textColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.75];
label.backgroundColor = [UIColor clearColor];
[headerView addSubview:label];

18
Спасибі DoctorG - Це було корисно. BTW - щоб зберегти існуючу мітку, надану dataSource, я змінив 2-й рядок так: label.text = [tableView.dataSource tableView: tableView titleForHeaderInSection: section]; Можливо, це буде погана форма, але це працювало на мене. Можливо, це може допомогти комусь іншому.
JJ Rohrer

1
@JJ Ця форма насправді прекрасна, оскільки ви викликаєте той самий метод, який ви спочатку використовували для визначення заголовка розділу таблиці.
Тім

3
Я видалив автовипуск і змінив його на явний випуск. Методи форматування UITableView називаються багато, багато разів. Уникайте використання автоматичного випуску, коли це можливо.
пам’ятки

@ Harkonian, а не змінювати подану відповідь, будь ласка, рекомендуйте змінити коментар до відповіді. Вважається поганою формою змінити код інших людей за допомогою редагування. Орфографічні помилки, неправильне форматування та граматика - це чесна гра.
Олов'яний чоловік

1
Замість addSubview: UILabel, ви просто повинні повертати UILabel у поданніForHeaderInSection. UILable is-a UIView вже :)
Nas Banov

52

Це можна зробити, якщо ви хочете, щоб заголовок із спеціальним кольором:

[[UITableViewHeaderFooterView appearance] setTintColor:[UIColor redColor]];

Це рішення чудово працює з iOS 6.0.


1
гм ... це не працює для мене. спробував симулятор iOS 6 та пристрій iOS 7. Ви протестували таким чином? Де я повинен її розмістити?
Максим Холявкін

Це можна зробити в застосуванні: didFinishLaunchingWithOptions: метод делегата програми.
Лешек Зарна

моя вина: я намагався використовувати цей спосіб, коли UITableViewStyleGrouped BTW: щоб змінити колір тексту таким чином, слід використовувати stackoverflow.com/a/20778406/751932
Максим Холявкін

Якщо це в користувацькому UIView, просто покладіть його - init метод.
felixwcf

31

Наступне рішення працює для Swift 1.2 з iOS 8+

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

    // This changes the header background
    view.tintColor = UIColor.blueColor()

    // Gets the header view as a UITableViewHeaderFooterView and changes the text colour
    var headerView: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    headerView.textLabel.textColor = UIColor.redColor()

}

22

Встановлення кольору фону на UITableViewHeaderFooterView застаріле. Будь ласка, використовуйте contentView.backgroundColorзамість цього.


21

Не забудьте додати цей фрагмент коду від делегата, інакше ваш вигляд буде відрізаний або з'явиться за столом у деяких випадках, відносно висоти вашого перегляду / мітки.

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

Це більше не потрібно, якщо ви дотримуєтесь iOS6 та пізнішої відповіді Dj S.
Bjinse

21

Ви можете зробити це на main.storyboard приблизно за 2 секунди.

  1. Виберіть Перегляд таблиці
  2. Перейдіть до інспектора атрибутів
  3. Елемент списку
  4. Прокрутіть униз до перегляду підзаголовка
  5. Змінити "фон"

Погляньте тут


18

Якщо ви не хочете створити спеціальний вид, ви також можете змінити такий колір (потрібен iOS 6):

-(void) tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    if ([view isKindOfClass: [UITableViewHeaderFooterView class]]) {
        UITableViewHeaderFooterView* castView = (UITableViewHeaderFooterView*) view;
        UIView* content = castView.contentView;
        UIColor* color = [UIColor colorWithWhite:0.85 alpha:1.]; // substitute your color here
        content.backgroundColor = color;
    }
}

13

Встановіть колір фону та тексту області розділу: (Завдяки William Jockuschта Dj S)

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    if ([view isKindOfClass: [UITableViewHeaderFooterView class]]) {
        UITableViewHeaderFooterView* castView = (UITableViewHeaderFooterView*) view;
        castView.contentView.backgroundColor = [UIColor grayColor];
        [castView.textLabel setTextColor:[UIColor grayColor]];
    }
}

13

Швидкий 4

Щоб змінити колір фону , колір тексту етикетки і шрифт для заголовка Вид в розділі UITableView, просто перевизначити willDisplayHeaderViewдля подання таблиці , як так:

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        let header = view as! UITableViewHeaderFooterView
        header.backgroundView?.backgroundColor = .white
        header.textLabel?.textColor = .black
        header.textLabel?.font = UIFont(name: "Helvetica-Bold", size: 14)
} 

Це прекрасно працювало для мене; сподіваюся, що це теж допоможе вам!


Встановлення кольору фону на UITableViewHeaderFooterView застаріле. Ви повинні встановити власний UIView з потрібним кольором фону для властивості backgroundView.
mojtaba al moussawi

10

Ось як додати зображення у подання заголовка:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{
    UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];
    UIImageView *headerImage = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-gery-bar.png"]] autorelease];

    headerImage.frame = CGRectMake(0, 0, tableView.bounds.size.width, 30);

    [headerView addSubview:headerImage];

    return headerView;
}

8

Для iOS8 (Beta) та Swift виберіть потрібний колір RGB і спробуйте це:

override func tableView(tableView: UITableView!, viewForHeaderInSection section: Int) -> UIView! {
    var header :UITableViewHeaderFooterView = UITableViewHeaderFooterView()

    header.contentView.backgroundColor = UIColor(red: 254.0/255.0, green: 190.0/255.0, blue: 127.0/255.0, alpha: 1)
    return header

}

("Переосмислення" є, оскільки я використовую UITableViewController замість звичайного UIViewController в моєму проекті, але це не обов'язково для зміни кольору заголовка розділу

Текст вашого заголовка все ще буде видно. Зауважте, що вам потрібно буде відрегулювати висоту заголовка розділу.

Щасти.


6

SWIFT 2

Мені вдалося змінити колір тла розділу з додаванням ефекту розмиття (що дуже цікаво). Щоб легко змінити колір фону розділу:

  1. Спочатку перейдіть до таблиці розкадри та виберіть Перегляд таблиці
  2. Перейдіть до інспектора атрибутів
  3. Елемент списку
  4. Прокрутіть униз до Перегляд
  5. Змінити "Передумови"

Потім для ефекту розмиття додайте до коду:

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

    // This is the blur effect

    let blurEffect = UIBlurEffect(style: .Light)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)

    // Gets the header view as a UITableViewHeaderFooterView and changes the text colour and adds above blur effect
    let headerView: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    headerView.textLabel!.textColor = UIColor.darkGrayColor()
    headerView.textLabel!.font = UIFont(name: "HelveticaNeue-Light", size: 13)
    headerView.tintColor = .groupTableViewBackgroundColor()
    headerView.backgroundView = blurEffectView

}

5

Я знаю, що він відповів, про всяк випадок, в Swift використовують наступне

    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let tableViewWidth = self.tableView.bounds

        let headerView = UIView(frame: CGRectMake(0, 0, tableViewWidth.size.width, self.tableView.sectionHeaderHeight))
        headerView.backgroundColor = UIColor.greenColor()

        return headerView
    }

4

iOS 8+

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        tableView.tableHeaderView?.backgroundColor = UIColor.blue()
}

4

На основі відповіді @Dj S, використовуючи Swift 3. Це чудово працює на iOS 10.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    // Background color
    view.tintColor = UIColor.black

    // Text Color
    let headerView = view as! UITableViewHeaderFooterView
    headerView.textLabel?.textColor = UIColor.white
}

3

У мене є проект із використанням комірок статичної таблиці, в iOS 7.x. willDisplayHeaderView не працює. Однак цей спосіб працює нормально:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    NSLog(@"%s", __FUNCTION__);
    CGRect headerFrame = CGRectMake(x, y, w, h);    
    UIView *headerView = [[UIView alloc] initWithFrame:headerFrame];  
    headerView.backgroundColor = [UIColor blackColor];

3
 -(void) tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view
  forSection:(NSInteger)section
  {
        if ([view isKindOfClass: [UITableViewHeaderFooterView class]])
        {
             UITableViewHeaderFooterView *castView = (UITableViewHeaderFooterView *) view;
             UIView *content = castView.contentView;
             UIColor *color = [UIColor whiteColor]; // substitute your color here
             content.backgroundColor = color;
             [castView.textLabel setTextColor:[UIColor blackColor]];
        }
 }

3

Я думаю, що цей код не такий вже й поганий.

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tableView.dequeueReusableHeaderFooterViewWithIdentifier(MyHeaderView.reuseIdentifier) as MyHeaderView
    let backgroundView = UIView()
    backgroundView.backgroundColor = UIColor.whiteColor()
    headerView.backgroundView = backgroundView
    headerView.textLabel.text = "hello"
    return headerView
}

3

Swift 4 робить це дуже легко. Просто додайте це до свого класу та встановіть колір за потребою.

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        view.backgroundColor = UIColor(red: 0.094, green: 0.239, blue: 0.424, alpha: 1.0)
    }

або якщо простий колір

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        view.backgroundColor = UIColor.white
    }

Оновлено для Swift 5

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        view.tintColor = UIColor(red: 0.094, green: 0.239, blue: 0.424, alpha: 1.0)
    }

або якщо простий колір

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        view.tintColor = UIColor.white
    }

4
в iOS 13 замініть "view.backgroundColor" на "view.tintColor".
Богдан Разван

2

У iOS 7.0.4 я створив власний заголовок із власним XIB. Нічого тут не згадувалося. Це повинен був бути підкласом UITableViewHeaderFooterView для роботи з, dequeueReusableHeaderFooterViewWithIdentifier:і здається, що клас дуже впертий щодо кольору фону. Отже, нарешті я додав UIView (ви можете це зробити або з кодом, або IB) з ім'ям customBackgroudView, а потім встановіть його властивість backgroundColor. У layoutSubviews: я встановлюю рамки цього виду на межі. Він працює з iOS 7 і не дає ніяких збоїв.

// in MyTableHeaderView.xib drop an UIView at top of the first child of the owner
// first child becomes contentView

// in MyTableHeaderView.h
@property (nonatomic, weak) IBOutlet UIView * customBackgroundView;

// in MyTableHeaderView.m
-(void)layoutSubviews;
{
    [super layoutSubviews];

    self.customBackgroundView.frame = self.bounds;
}
// if you don't have XIB / use IB, put in the initializer:
-(id)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
    ...
    UIView * customBackgroundView = [[UIView alloc] init];
    [self.contentView addSubview:customBackgroundView];
    _customBackgroundView = customBackgroundView;
    ...
}


// in MyTableViewController.m
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    MyTableHeaderView * header = [self.tableView
                                          dequeueReusableHeaderFooterViewWithIdentifier:@"MyTableHeaderView"];
    header.customBackgroundView.backgroundColor = [UIColor redColor];
    return header;
}

2

Просто змініть колір шару подання заголовка

- (UIView *) tableView: (UITableView *) tableView viewForHeaderInSection: (NSInteger) розділ 
{
  UIView * headerView = [[[UIView alloc] initWithFrame: CGRectMake (0, 0, tableView.bounds.size.width, 30)] автовипуск];
 headerView.layer.backgroundColor = [UIColor clearColor] .CGColor
}


2

Якщо комусь потрібно швидко, зберігає заголовок:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView(frame: CGRect(x: 0,y: 0,width: self.tableView.frame.width, height: 30))
    view.backgroundColor = UIColor.redColor()
    let label = UILabel(frame: CGRect(x: 15,y: 5,width: 200,height: 25))
    label.text = self.tableView(tableView, titleForHeaderInSection: section)
    view.addSubview(label)
    return view
}

2

Я отримав повідомлення від Xcode через журнал консолі

[TableView] Налаштування кольору фону на UITableViewHeaderFooterView застаріло. Будь ласка, встановіть на власність backgroundView власний UIView із потрібним кольором тла.

Тоді я просто створюю новий UIView і відкладаю його як фон HeaderView. Не вдале рішення, але це легко, як сказав Xcode.


2

У моєму випадку це спрацювало так:

let headerIdentifier = "HeaderIdentifier"
let header = self.tableView.dequeueReusableHeaderFooterView(withIdentifier: headerIdentifier)
header.contentView.backgroundColor = UIColor.white

2

Просто встановіть колір тла перегляду фону:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){         
  let tableHeader = view as! UITableViewHeaderFooterView        
  tableHeader.backgroundView?.backgroundColor = UIColor.white     
}

1

За допомогою RubyMotion / RedPotion вставте це у свій TableScreen:

  def tableView(_, willDisplayHeaderView: view, forSection: section)
    view.textLabel.textColor = rmq.color.your_text_color
    view.contentView.backgroundColor = rmq.color.your_background_color
  end

Працює як шарм!


1

Для швидких 5 +

В willDisplayHeaderViewметод

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

     //For Header Background Color
     view.tintColor = .black

    // For Header Text Color
    let header = view as! UITableHeaderFooterView
    header.textLabel?.textColor = .white
}

Я сподіваюся, що це допоможе вам:]


0

Хоча це func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)буде також добре, ви можете досягти цього, не застосовуючи іншого методу делегата. у вашому func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?методі ви можете використовувати view.contentView.backgroundColor = UIColor.whiteзамість view.backgroundView?.backgroundColor = UIColor.whiteякого не працює. (Я знаю, що backgroundViewце необов’язково, але навіть коли він є, це не пробудження без впровадженняwillDisplayHeaderView

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