iPhone UITableView с областью заголовка - PullRequest
38 голосов
/ 27 января 2010

У меня есть представление, которое было создано со всеми материалами по умолчанию UITableView, но теперь мне нужно добавить область заголовка выше, где UITableView (так что UITableView будет прокручиваться нормально, но верхние 100px экрана или около того будет иметь статическое содержимое заголовка). Я не вижу, где я могу изменить размер UITableView в IB, и не уверен, как это сделать.

Кто-нибудь знает?

Ответы [ 8 ]

57 голосов
/ 20 апреля 2011

Методы UITableViewDelegate можно использовать для создания настраиваемого представления заголовка таблицы и указания высоты, а именно tableView:viewForHeaderInSection: и tableView:heightForHeaderInSection:. Вы можете добавить все, что вам нравится в представлении. Вот пример, который добавляет выравнивание по правому краю UILabel:

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

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,30)];

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

    headerLabel.textAlignment = NSTextAlignmentRight;
    headerLabel.text = [titleArray objectAtIndex:section];
    headerLabel.backgroundColor = [UIColor clearColor];

    [headerView addSubview:headerLabel];

    return headerView;

}

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

    return  30.0;
}
46 голосов
/ 27 января 2010

Почему бы вам не использовать предоставленный UITableView заголовок? Как следует:

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

{
     return @"My Title";
}

Кроме того, вы можете изменить размер табличного представления в IB, перетаскивая границы.

16 голосов
/ 13 апреля 2011

Когда вы добавляете UIView или один из его подклассов на UITableView с помощью IB (просто перетащите UIView и поместите его в верхнюю часть UITableView вашего), он автоматически добавляет этот компонент UIView и делает его компонентом tableHeader.

Каждый UITableView имеет один tableHeader и один tableFooter зарезервированный компонент ...

Таким образом, новое представление будет частью UITable, и прокрутите с ним или появитесь / исчезните, или что вы делаете с таблицей. Вы можете изменить его скрытое свойство, если вам нужно условное поведение.

С другой стороны, если вы хотите, чтобы представление заголовка оставалось на месте при прокрутке таблицы, то лучше уменьшить размер таблицы и поместить заголовок над ней, как это предлагается в других ответах ...

6 голосов
/ 31 января 2012

Я наконец-то решил эту проблему правильным образом, не меняя базовый класс. Один ответ, чтобы добавить представление к родительскому контроллеру навигации, хорош, но переходы выглядят ужасно

Исправить на самом деле легко. Хитрость заключается в том, чтобы создать собственный установщик и получатель для свойства self.tableView. Затем в loadView вы заменяете представление новым UIView и добавляете tableView к нему. Тогда вы можете добавлять подпредставления вокруг tableView. Вот как это делается:

В шапке:

@interface CustomTableViewController : UITableViewController
{
    UITableView *tableView;
} 

В .м:

- (UITableView*)tableView
{
    return tableView;
}

- (void)setTableView:(UITableView *)newTableView
{
    if ( newTableView != tableView )
    {
        [tableView release];
        tableView = [newTableView retain];
    }        
}

- (void)loadView {
    [super loadView];
    //save current tableview, then replace view with a regular uiview
    self.tableView = (UITableView*)self.view;
    self.view = [[UIView alloc] initWithFrame:self.tableView.frame];
    [self.view addSubview:self.tableView];    

    //code below adds some custom stuff above the table
    UIView *customHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)];
    customHeader.backgroundColor = [UIColor redColor];
    [self.view addSubview:customHeader];
    [customHeader release];

    self.tableView.frame = CGRectMake(0, customHeader.frame.size.height, self.view.frame.size.width, self.view.frame.size.height - customHeader.frame.size.height);
}

- (void)viewDidUnload
{
    self.tableView = nil;
    [super viewDidUnload];
}

Наслаждайтесь!

3 голосов
/ 27 января 2010

Вам нужно будет вставить UITableView в UIView вместе с другим представлением (которое вы называете разделом заголовка).

Итак, у UIView будет 2 подпредставления. Представление заголовка, сопровождаемое представлением таблицы.

  • UIView (родитель)
    • UIView (заголовок)
    • UITableView (таблица)

Надеюсь, это поможет.

0 голосов
/ 21 июля 2011

Нашел решение на iphonedevsdk

Вместо этого:

[tableViewController.view addSubview:viewSubclass];

сделать это

[tableViewController.navigationController.view addSubview:viewSubclass];
0 голосов
/ 27 июня 2011

Предположим, у вас есть UITableViewController

@interface MXMTableViewController : UITableViewController <UITableViewDelegate,UIScrollViewDelegate> {
/// your table view interface here
}

и xib с вашим простым UITableView, определенным в нем, вы можете сделать так, как говорит Михир, переопределяя метод loadView следующим образом:

- (void)loadView {

    [super loadView];

    UIView *mainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

    self.view = mainView;

    [mainView release];

    // Add Header View
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 36)];
    headerView.backgroundColor = [UIColor redColor];
    [self.view addSubview:headerView];

    // now, move your table view down. Check you nib to choose 
    // the right Y-axis offset
    CGRect f = tableView.frame;
    f.origin.y += headerView.frame.size.height/2;
    tableView.frame = f;

    // Add the table view to the container view
    [self.view addSubview:self.tableView];

    // Add footer
    UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, self.tableView.frame.size.height, 320, 125)];
    footerView.backgroundColor = [UIColor redColor];
    [self.view addSubview:footerView];
    [footerView release];

    [headerView release];

}

... и все. У вас есть UITableView с фиксированным верхним и нижним колонтитулом.

PS. Теперь вы можете использовать свои пользовательские представления xib в качестве заголовков и представлений нижнего колонтитула.

0 голосов
/ 31 мая 2011

Мне нравится ответ от noodl_es (upvoted), потому что он обеспечивает необходимую функциональность и поведение, но вам не нужно беспокоиться об изменении размера UITableView: он обрабатывается автоматически. Однако решение лучше всего подходит, только если информация заголовка относится конкретно к первому разделу таблицы (или если таблица имеет только один раздел). Если таблица имеет более одного раздела, то заголовок второго раздела при прокрутке будет отталкивать заголовок первого раздела, и, следовательно, представление заголовка не будет относиться ко всей таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...