2010-01-26 3 views
38

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

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

ответ

46

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

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

{ 
    return @"My Title"; 
} 

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

+0

Мне нужно поставить больше, чем заголовок текста, который предоставляет UITableView. Это будет 100px или так высокой области с изображением человека в левой части и некоторыми деталями справа. Вид таблицы под заголовком будет списком сообщений человека в блог компании. Вот почему мне нужна область заголовка отдельно от UITableView. –

+0

Тогда лучший подход - сделать таблицу меньшей. Убедитесь, что свойство View Controllers «view» является фактическим UIView, а не UITableView таким образом, что вы можете сначала перетащить UITableView в UIView, а затем перетащить границы до нужного размера. –

+0

Тем не менее, предоставление вашего индивидуального UIView для tableView: viewForHeaderInSection: возможно, будет работать в этом случае! –

3

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

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

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

Надеется, что это помогает.

16

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

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

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

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

57

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

в ios7, 'UITextAlignment' устарел, вместо этого используйте' NSTextAlignment' –

+0

Спасибо @indienchild - я обновил его для ARC & iOS 7. –

+1

Спасибо ... !!!! –

0

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

+0

Спасибо за upvote! Не можете ли вы использовать переменную раздела, чтобы указать, какие разделы (ы) отображаются в вашем представлении пользовательского заголовка? –

+1

@noodl_es Я думаю, что OP пыталась добавить статический («заголовок») вид в том смысле, что один и тот же вид должен быть виден независимо от того, как прокручивается таблица. Я понимаю, что представление должно быть в значительной степени независимым от табличного представления, поэтому было бы вопрос о добавлении независимого UIView над UITableView. Возможно, я ошибаюсь, это давно, давно (мне было 5 минут, чтобы узнать, что я здесь разместил :-) – rene

0

Предположим, чтобы ваш UITableViewController

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

и XIB с вами простой UITableView определен еще в нем, вы можете сделать, как Mihir говорит перекрывая 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

f.origin.y + = headerView.frame.size.height/2; ? Я думаю, что он не делится на два, это ** f.origin.y + = headerView.frame.size.высота; ** – SpaceDog

0

Found a solution at iphonedevsdk

Вместо того, чтобы сделать это:

[tableViewController.view addSubview:viewSubclass]; 

сделать

[tableViewController.navigationController.view addSubview:viewSubclass]; 
6

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

Исправление на самом деле легко. Хитрость заключается в создании пользовательских настроек и 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]; 
} 

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

+0

Это потрясающе! Спасибо за этот полезный отзыв! – SparkyNZ

+0

Это просто рисует черный экран для меня на iOS 6. –

Смежные вопросы