Настройте раздел заголовка UITableView

126

Я хочу настроить заголовок UITableView для каждого раздела. Пока я реализовал

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

этот метод UITabelViewDelegate. Я хочу получить текущий заголовок для каждого раздела и просто добавить UILabel в качестве подпредставления.

Пока что я не могу этого сделать. Потому что я не смог найти ничего, чтобы получить заголовок раздела по умолчанию. Первый вопрос, есть ли способ получить заголовок раздела по умолчанию?

Если это невозможно, мне нужно создать контейнерное представление, которое является UIView но на этот раз мне нужно установить цвет фона по умолчанию, цвет тени и т.д. Потому что, если вы внимательно посмотрите на заголовок раздела, он уже настроен.

Как я могу получить эти значения по умолчанию для каждого заголовка раздела?

Спасибо вам всем.

  • 1
    Что не так с использованием tableView:titleForHeaderInSection:
  • 0
    Он возвращает NSString , мне нужно установить собственный шрифт, поэтому я не могу, если я использую tableView:titleForHeaderInSection:
Показать ещё 2 комментария
Теги:
uitableview

21 ответ

283
Лучший ответ

Вы можете попробовать следующее:

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 18)];
    /* Create custom view to display section header... */
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, tableView.frame.size.width, 18)];
    [label setFont:[UIFont boldSystemFontOfSize:12]];
     NSString *string =[list objectAtIndex:section];
    /* Section header is in 0th index... */
    [label setText:string];
    [view addSubview:label];
    [view setBackgroundColor:[UIColor colorWithRed:166/255.0 green:177/255.0 blue:186/255.0 alpha:1.0]]; //your background color...
    return view;
}
  • 0
    вот ваш цвет bg, какой бы цвет вы не хотите установить, вы можете
  • 0
    Это проблема, я уже сделал то, что вы написали. Но я не знаю цвет фона по умолчанию заголовка раздела, который является своего рода серым. Но мне нужно, чтобы он был точно заголовком раздела по умолчанию.
Показать ещё 6 комментариев
39

Выбранный ответ с использованием tableView :viewForHeaderInSection: правильный.

Просто поделитесь советами здесь.

Если вы используете раскадровку /xib, тогда вы можете создать другую ячейку прототипа и использовать ее для своей "секции ячейки". Код для настройки заголовка аналогичен тому, как вы настраиваете ячейки ячеек.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    static NSString *HeaderCellIdentifier = @"Header";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:HeaderCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:HeaderCellIdentifier];
    }

    // Configure the cell title etc
    [self configureHeaderCell:cell inSection:section];

    return cell;
}
  • 12
    Есть несколько вещей не так с этим решением. Во-первых, это тот факт, что если вы реализуете «tableView (tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool», вы заметите, что заголовок раздела будет перемещаться вместе со строкой при скольжении. Чтобы избежать этого, вы должны вместо этого вернуть cell.contentView. Большая проблема заключается в том, что с этим решением приложение будет аварийно завершать работу при длительном нажатии на заголовок раздела. Правильный способ - создать перо, расширяющее UITableViewHeaderFooterView, зарегистрировать его в табличном представлении и вернуть его в этом методе. Протестировано на iOS8
  • 0
    @Kachi Решение использует viewForHeaderInSection не canEditRowAtIndexPath как вы упомянули. Я никогда не проверял сбой, который вы сказали, но не могли бы вы осознать, как длительное нажатие вызовет сбой?
Показать ещё 4 комментария
29

Быстрая версия Lochana Tejas ответ:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView(frame: CGRectMake(0, 0, tableView.frame.size.width, 18))
    let label = UILabel(frame: CGRectMake(10, 5, tableView.frame.size.width, 18))
    label.font = UIFont.systemFontOfSize(14)
    label.text = list.objectAtIndex(indexPath.row) as! String
    view.addSubview(label)
    view.backgroundColor = UIColor.grayColor() // Set your background color

    return view
}
  • 0
    Как сделать динамику высоты надписи в соответствии с текстом, который находится внутри представления?
  • 0
    Ключевое слово override является избыточным. Более того, рассмотрите возможность повторного использования представлений заголовков, а не их повторного создания.
17

Если вы используете заголовок заголовка по умолчанию, вы можете изменить текст на нем с помощью

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

Для Swift:

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

Если вы хотите настроить представление, вам нужно создать новый.

11

почему бы не использовать UITableViewHeaderFooterView?

  • 0
    Вы можете использовать это, только если вы также не используете - (UIView *) tableView: (UITableView *) tableView viewForHeaderInSection: (NSInteger) раздел.
  • 1
    Совершенно правильный ответ. Кроме того, использование UITableViewHeaderFooterView выигрывает от повторного использования представления, как ячеек.
Показать ещё 1 комментарий
8

Если headerInSection не отображается, попробуйте это.

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

Это возвращает высоту для заголовка данного раздела.

  • 1
    Не могли бы вы проработать ваш ответ?
  • 0
    Раздел заголовка не будет отображаться, если вы не укажете методом hook высоту заголовка раздела. UITableView по умолчанию не показывает заголовки, если высота не указана. @CinCout
5

Свифт 3 версии lochana и estemendoza отвечает:

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

    let view = UIView(frame: CGRect(x:0, y:0, width:tableView.frame.size.width, height:18))
    let label = UILabel(frame: CGRect(x:10, y:5, width:tableView.frame.size.width, height:18))
    label.font = UIFont.systemFont(ofSize: 14)
    label.text = "This is a test";
    view.addSubview(label);
    view.backgroundColor = UIColor.gray;
    return view

}

Кроме того, имейте в виду, что вы также должны реализовать:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 100;
}
5

Попробуйте это......

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
{
    // Background view is at index 0, content view at index 1
    if let bgView = view.subviews[0] as? UIView
    {
        // do your stuff
    }

    view.layer.borderColor = UIColor.magentaColor().CGColor
    view.layer.borderWidth = 1
}
4
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    //put your values, this is part of my code
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 30.0f)];
    [view setBackgroundColor:[UIColor redColor]];
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 5, 150, 20)];
    [lbl setFont:[UIFont systemFontOfSize:18]];
    [lbl setTextColor:[UIColor blueColor]];
    [view addSubview:lbl];

    [lbl setText:[NSString stringWithFormat:@"Section: %ld",(long)section]];

    return view;
}
3

Другие ответы хорошо воссоздают представление заголовка по умолчанию, но на самом деле не отвечают на ваш главный вопрос:

Есть ли способ получить заголовок раздела по умолчанию?

Есть способ - просто реализовать tableView:willDisplayHeaderView:forSection: в вашем tableView:willDisplayHeaderView:forSection:. Представление заголовка по умолчанию будет передано во второй параметр, и оттуда вы можете привести его к UITableViewHeaderFooterView а затем добавить/изменить подпредставления по своему желанию.

Obj-C,

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

    // Do whatever with the header view... e.g.
    // headerView.textLabel.textColor = [UIColor whiteColor]
}

стриж

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

    // Do whatever with the header view... e.g.
    // headerView.textLabel?.textColor = UIColor.white
}
  • 0
    Вам не нужно разыгрывать это. Вы можете просто добавить то, что вы хотите к представлению. На самом деле, создание нового объекта ничего не даст, если вы не назначите его для view .
  • 0
    @AlexZavatone Это верно, вам не нужно разыгрывать его, если вы просто добавляете представления. Это полезно, если вы хотите настроить некоторые виды по умолчанию, такие как текстовая метка.
Показать ещё 1 комментарий
3

Это самое простое решение. Следующий код может использоваться непосредственно для создания заголовка настраиваемого раздела.

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    SectionHeaderTableViewCell *headerView = [tableView dequeueReusableCellWithIdentifier:@"sectionHeader"];

    //For creating a drop menu of rows from the section
    //==THIS IS JUST AN EXAMPLE. YOU CAN REMOVE THIS IF-ELSE.==
    if (![self.sectionCollapsedArray[section] boolValue])
    {
        headerView.imageView.image = [UIImage imageNamed:@"up_icon"];
    }
    else
    {
        headerView.imageView.image = [UIImage imageNamed:@"drop_icon"];
    }

    //For button action inside the custom cell
    headerView.dropButton.tag = section;
    [headerView.dropButton addTarget:self action:@selector(sectionTapped:) forControlEvents:UIControlEventTouchUpInside];

    //For removing long touch gestures.
    for (UIGestureRecognizer *recognizer in headerView.contentView.gestureRecognizers)
    {
        [headerView.contentView removeGestureRecognizer:recognizer];
        [headerView removeGestureRecognizer:recognizer];
    }

    return headerView.contentView;
}

ПРИМЕЧАНИЕ. SectionHeaderTableViewCell - это настраиваемый UITableViewCell, созданный в Storyboard.

  • 0
    SectionHeaderTableViewCell - использование необъявленного идентификатора
  • 0
    @BorisGafurov SectionHeaderTableViewCell - это просто пример имени, которое я дал своему UITableViewCell, который я создал в раскадровке.
2
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    if([view isKindOfClass:[UITableViewHeaderFooterView class]]){

        UITableViewHeaderFooterView *headerView = view;

        [[headerView textLabel] setTextColor:[UIColor colorWithHexString:@"666666"]];
        [[headerView textLabel] setFont:[UIFont fontWithName:@"fontname" size:10]];
    }
}

Если вы хотите изменить шрифт textLabel в заголовке раздела, вы хотите сделать это в файле willDisplayHeaderView. Чтобы установить текст, вы можете сделать это в viewForHeaderInSection или titleForHeaderInSection. Удачи!

2

Если бы я был вами, я бы сделал метод, который возвращает UIView, если он содержит NSString. Например

+ (UIView *) sectionViewWithTitle:(NSString *)title;

В реализации этого метода создайте UIView, добавьте UILabel к нему со свойствами, которые вы хотите установить, и, конечно же, установите его заголовок для данного.

  • 0
    Да, я могу это сделать, но мой вопрос в том, как мне получить фон заголовка раздела по умолчанию, теневое значение, остальное легко реализовать.
  • 0
    что вы имеете в виду по умолчанию фон заголовка раздела
Показать ещё 1 комментарий
1

@samwize решение в Swift (так что повышайте его!). Блестящий, используя тот же механизм рециркуляции также для разделов заголовка/нижнего колонтитула:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let settingsHeaderSectionCell:SettingsHeaderSectionCell = self.dequeueReusableCell(withIdentifier: "SettingsHeaderSectionCell") as! SettingsHeaderSectionCell

    return settingsHeaderSectionCell
}
1

Магически добавьте заголовок таблицы в быстрый

Недавно я попробовал это.

Мне нужен один и только один заголовок во всем UITableView.

Как я хотел UIImageView в верхней части TableView. Поэтому я добавил UIImageView поверх UITableViewCell и автоматически добавил его как tableViewHeader. Теперь я подключаю ImageView к ViewController и добавил изображение.

Я был смущен, потому что я сделал что-то подобное в первый раз. Поэтому, чтобы очистить мою путаницу, откройте xml-формат MainStoryBoard и обнаружил, что Image View был добавлен как заголовок.

Это сработало для меня. Спасибо xCode и быстро.

  • 0
    Спасибо Сомир, у меня это сработало :)
0

swif 4.2

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }

    header.textLabel?.textAlignment = .center // for all sections

    switch section {
    case 1:  //only section No.1
        header.textLabel?.textColor = .black
    case 3:  //only section No.3
        header.textLabel?.textColor = .red
    default: //
        header.textLabel?.textColor = .yellow
    }
}
0

Используйте tableView: willDisplayHeaderView:, чтобы настроить представление, когда оно будет отображаться.

Это дает вам преимущество в том, что вы можете принять представление, которое уже было создано для представления заголовка, и расширить его, вместо того, чтобы самостоятельно воссоздать все представление заголовка.

Вот пример, который окрашивает секцию заголовка на основе BOOL и добавляет текстовый элемент детали в заголовок.

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
//    view.tintColor = [UIColor colorWithWhite:0.825 alpha:1.0]; // gray
//    view.tintColor = [UIColor colorWithRed:0.825 green:0.725 blue:0.725 alpha:1.0]; // reddish
//    view.tintColor = [UIColor colorWithRed:0.925 green:0.725 blue:0.725 alpha:1.0]; // pink

    // Conditionally tint the header view
    BOOL isMyThingOnOrOff = [self isMyThingOnOrOff];

    if (isMyThingOnOrOff) {
        view.tintColor = [UIColor colorWithRed:0.725 green:0.925 blue:0.725 alpha:1.0];
    } else {
        view.tintColor = [UIColor colorWithRed:0.925 green:0.725 blue:0.725 alpha:1.0];
    }

    /* Add a detail text label (which has its own view to the section header… */
    CGFloat xOrigin = 100; // arbitrary
    CGFloat hInset = 20;
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(xOrigin + hInset, 5, tableView.frame.size.width - xOrigin - (hInset * 2), 22)];

    label.textAlignment = NSTextAlignmentRight;

    [label setFont:[UIFont fontWithName:@"Helvetica-Bold" size:14.0]
    label.text = @"Hi.  I'm the detail text";

    [view addSubview:label];
}
0

вызов этого метода делегата

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

return @"Some Title";
}

это даст возможность автоматически добавлять заголовок по умолчанию с динамическим заголовком.

Вы можете использовать многоразовый и настраиваемый верхний/нижний колонтитул.

https://github.com/sourov2008/UITableViewCustomHeaderFooterSection

0

Возвращаясь к исходному вопросу (4 года спустя), вместо того, чтобы перестраивать собственный заголовок раздела, iOS может просто позвонить вам (с помощью willDisplayHeaderView: forSection:) сразу после его создания по умолчанию. Например, я хотел добавить кнопку графика на правый край заголовка раздела:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    UITableViewHeaderFooterView * header = (UITableViewHeaderFooterView *) view;
    if (header.contentView.subviews.count >  0) return; //in case of reuse
    CGFloat rightEdge = CGRectGetMaxX(header.contentView.bounds);
    UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(rightEdge - 44, 0, 44, CGRectGetMaxY(header.contentView.bounds))];
    [button setBackgroundImage:[UIImage imageNamed:@"graphIcon"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(graphButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:button];
}
0

Если вы просто хотите добавить заголовок в заголовок tableView, не добавляйте представление. В swift 3.x код выглядит следующим образом:

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    var lblStr = ""
    if section == 0 {
        lblStr = "Some String 1"
    }
    else if section == 1{
        lblStr = "Some String 2"
    }
    else{
        lblStr = "Some String 3"
    }
    return lblStr
}

Вы можете реализовать массив для выбора заголовка для заголовков.

0

Кроме того, для titleForHeaderInSection вы можете просто изменить представление заголовка, нижнего колонтитула. проверьте мой комментарий здесь: Изменить UITable раздел backgroundColor без потери раздела Заголовок

Ещё вопросы

Сообщество Overcoder
Наверх
Меню