Добавление 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?
Nandish A

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

Вы можете сделать это довольно легко в Интерфейсном Разработчике. Просто создайте представление с таблицей и поместите другое представление на стол. Это станет представлением заголовка таблицы. Добавьте ваши ярлыки и изображения для этого представления. Смотрите рисунок ниже для иерархии представления. Просмотр иерархии в Интерфейсном Разработчике


12
Я предпочитаю этот ответ, так как зачем писать код, когда я могу аккуратно его настроить и поместить в IB
Besi

1
офигенно спасибо за подсказку. Кстати, вам не нужен вид прокрутки в заголовке на случай, если кто-то еще задумался или попробовал это. Он использует ScrollView UITableView для вашего заголовка, поскольку технически заголовок является частью UITableView
Роб Р.

2
Стоит упомянуть, как это работает в редакторе StoryBoard сейчас: stackoverflow.com/q/7841167/926907
Дмитрий Зайцев

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

1
Это не позволит мне добавить ограничение высоты для представления заголовка.
Ян Уорбертон

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 или выше вызовет предупреждение во время выполнения: «нет пути индекса для повторного использования ячейки таблицы». Чтобы избежать этой ошибки, ссылка на ссылку
baskInEminence

11

Вы также можете просто создать ТОЛЬКО UIView в Интерфейсном конструкторе и перетащить ImageView и UILabel (чтобы он выглядел как нужный заголовок), а затем использовать это.

Как только ваш UIView выглядит так, как вы этого хотите, вы можете программно инициализировать его из XIB и добавить в свой UITableView. Другими словами, вам не нужно разрабатывать ВСЮ таблицу в IB. Просто 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.