Подтвердить что ты не робот

IPhone UITableView с областью заголовка

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

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

4b9b3361

Ответ 1

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

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

{
     return @"My Title";
}

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

Ответ 2

Вы можете использовать методы 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;
}

Ответ 3

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

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

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

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

Ответ 4

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

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

В заголовке:

@interface CustomTableViewController : UITableViewController
{
    UITableView *tableView;
} 

В .m:

- (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];
}

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

Предположим, что у вас есть 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 как представления заголовка и нижнего колонтитула.

Ответ 8

Найден решение на iphonedevsdk

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

[tableViewController.view addSubview:viewSubclass];

сделайте это

[tableViewController.navigationController.view addSubview:viewSubclass];