Додавання iOS UITableView HeaderView (не заголовок розділу)


167

Я хочу додати заголовок таблиці (а не заголовки розділів), наприклад у програмі контактів: введіть тут опис зображення

точно так - мітка біля зображення над таблицею.

Я хочу, щоб весь погляд прокручувався, щоб я не міг розміщувати їх поза столом.

Як я можу це зробити?

Відповіді:


245

UITableViewмає tableHeaderViewвластивість. Встановіть це на будь-який вигляд, який ви хочете там.

Використовуйте новий UIViewяк контейнер, додайте текстову мітку та перегляд зображення до цього нового UIView, а потім встановіть tableHeaderViewновий.

Наприклад, у UITableViewController:

-(void)viewDidLoad
{
     // ...
     UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:imageView];
     UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:labelView];
     self.tableView.tableHeaderView = headerView;
     [imageView release];
     [labelView release];
     [headerView release];
     // ...
} 

Чудово! Дякую, що це працює. Чи є якась властивість зробити так, щоб осередки перегляду таблиць зростали настільки ж великими, як текст всередині?
Ассаф б

Для цього вам потрібно бути в змозі обчислити висоту комірки, заданої рядок, і передати це значення для heightForRowAtIndexPath. Ви можете використовувати метод NSString sizeWithFont: constrainedToSize: функцію, щоб визначити висоту тексту при обмеженні розміру.
Марк

Додайте його після макета, інакше розмір не буде бажаним. І viewDidLoad - хороше місце.
BollMose

Чи є гарною практикою встановлення геометрії подання під час фази viewDidLoad?
Нандіш А

1
нормально, якщо ви встановите подання заголовка в джерелі таблиць, воно, здається, працює, переконайтеся, що ви також встановите висоту: приклад:public override UIView GetViewForHeader(UITableView tableView, nint section) { return headerView; } public override nfloat GetHeightForHeader(UITableView tableView, nint section) { return headerView.Frame.Height; }
panthor314

193

Ви можете зробити це досить легко в Interface Builder. Просто створіть подання за допомогою таблиці та опустіть інший вигляд на стіл. Це стане переглядом заголовка таблиці. Додайте до цього вікна мітки та зображення. Дивіться малюнок нижче для ієрархії перегляду. Переглянути ієрархію у програмі інтерфейсу


12
Я віддаю перевагу цій відповіді, оскільки навіщо писати код, коли я можу акуратно його встановити та розмістити в IB
Бесі,

1
дивовижний спасибі за підказку. До речі, ви не потребуєте подання прокрутки у своєму заголовку на випадок, якщо хтось ще цікавився чи намагався цього. Він використовує ScritView UITableView для свого заголовка, оскільки технічний заголовок технічно є частиною UITableView
Роб Р.

2
Варто згадати, як це працює в редакторі StoryBoard зараз: stackoverflow.com/q/7841167/926907
Дмитро Зайцев

Не використовуйте для цього ручку. Завантаження займає більше часу. Запишіть його в код. Для повторного використання створіть спеціальний клас та інстанціюйте ...
Чарльз Робертсон

1
Це не дозволить мені додати обмеження висоти до подання заголовка.
Ian Warburton

14

У Свіфті :

override func viewDidLoad() {
    super.viewDidLoad()

    // We set the table view header.
    let cellTableViewHeader = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewHeaderCustomCellIdentifier) as! UITableViewCell
    cellTableViewHeader.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewHeaderCustomCellIdentifier]!)
    self.tableView.tableHeaderView = cellTableViewHeader

    // We set the table view footer, just know that it will also remove extra cells from tableview.
    let cellTableViewFooter = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewFooterCustomCellIdentifier) as! UITableViewCell
    cellTableViewFooter.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewFooterCustomCellIdentifier]!)
    self.tableView.tableFooterView = cellTableViewFooter
}

Використання цього підходу для iOS 7 або новішої версії призведе до попередження часу виконання: "шлях індексу для комірок таблиці не використовується повторно". Щоб уникнути цієї помилки,
посилайтеся на

11

Ви також можете просто створити ТІЛЬКІ UIView у конструкторі інтерфейсів та перетягнути зображення ImageView та UILabel (щоб він виглядав як потрібний заголовок), а потім використовувати це.

Як тільки ваш UIView виглядає так, як ви хочете, його можна програмно ініціалізувати з XIB та додати до свого UITableView. Іншими словами, вам не потрібно проектувати ЦІЛЬКУ таблицю в ІБ. Просто headerView (таким чином подання заголовка також можна повторно використовувати в інших таблицях)

Наприклад, у мене є спеціальний UIView для одного з моїх заголовків таблиць. Перегляд керується файлом xib під назвою "CustomHeaderView", і він завантажується в заголовок таблиці за допомогою наступного коду в моєму підкласі UITableViewController:

-(UIView *) customHeaderView {
    if (!customHeaderView) {
        [[NSBundle mainBundle] loadNibNamed:@"CustomHeaderView" owner:self options:nil];
    }

    return customHeaderView;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Set the CustomerHeaderView as the tables header view 
    self.tableView.tableHeaderView = self.customHeaderView;
}

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

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,30)];
    headerView.backgroundColor=[[UIColor redColor]colorWithAlphaComponent:0.5f];
    headerView.layer.borderColor=[UIColor blackColor].CGColor;
    headerView.layer.borderWidth=1.0f;

    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 5,100,20)];

    headerLabel.textAlignment = NSTextAlignmentRight;
    headerLabel.text = @"LeadCode ";
    //headerLabel.textColor=[UIColor whiteColor];
    headerLabel.backgroundColor = [UIColor clearColor];


    [headerView addSubview:headerLabel];

    UILabel *headerLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, headerView.frame.size.width-120.0, headerView.frame.size.height)];

    headerLabel1.textAlignment = NSTextAlignmentRight;
    headerLabel1.text = @"LeadName";
    headerLabel.textColor=[UIColor whiteColor];
    headerLabel1.backgroundColor = [UIColor clearColor];

    [headerView addSubview:headerLabel1];

    return headerView;

}

Не зрозуміли ваше запитання?
Приям

2
Це неправильно. Він хоче лише одного заголовка таблиці НЕ заголовка розділу. Дві речі дуже різні. Прочитайте, будь ласка, питання.
Чарльз Робертсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.