2010-01-26 13 views
38

Mam widok, który został utworzony z wszystkimi domyślnymi elementami UITableView, ale teraz muszę dodać obszar nagłówka powyżej, gdzie znajduje się UITableView (aby UITableView przewijało normalnie, ale top 100 pikseli ekranu lub tak będą miały statyczną zawartość nagłówka). Nie widzę, gdzie mogę zmienić rozmiar UITableView w IB, i nie jestem pewien, jak to zrobić.iPhone UITableView z obszarem nagłówka

Czy ktoś wie?

Odpowiedz

46

Dlaczego nie używasz nagłówka dostarczonego z UITableView ?. W następujący sposób:

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

{ 
    return @"My Title"; 
} 

Dodatkowo możesz zmienić rozmiar widoku tabeli w IB, przeciągając krawędzie.

+0

Potrzebuję umieścić więcej niż nagłówek tekstu, który zapewnia UITableView. Będzie to obszar o powierzchni 100 pikseli lub większej z obrazem osoby po lewej stronie i kilkoma szczegółami po prawej stronie. Widok tabeli pod nagłówkiem będzie listą wpisów danej osoby na blogu firmy. Dlatego potrzebuję obszaru nagłówka oddzielonego od UITableView. –

+0

Wtedy najlepszym podejściem byłoby zmniejszenie tabeli. Upewnij się, że właściwość View Controllers "view" jest rzeczywistym UIView, a nie UITableView w ten sposób, że możesz najpierw przeciągnąć UITableView do UIView, a następnie przeciągnąć granice do żądanego rozmiaru. –

+0

Nadal, dostarczając spersonalizowane UIView dla tableView: viewForHeaderInSection: prawdopodobnie zadziała w takim przypadku! –

3

Będziesz musiał osadzić UITableView w UIView razem z innym widokiem (który nazywasz sekcją nagłówka).

Tak więc UIView będzie mieć 2 subviews. Widok nagłówka, a następnie widok tabeli.

  • UIView (rodzic)
    • UIView (header)
    • UITableView (tabela)

Nadzieja to pomaga.

16

Gdy dodać UIView lub jednej z jej podklas na UITableView wykorzystaniem IB (wystarczy przeciągnąć UIView i upuść go w górnej części UITableView twoim), automatycznie dodaje, że UIView komponent i czyni ją „tableHeader” składnik.

Każdy UITableView ma jeden tableHeader i jeden składnik zastrzeżone tableFooter ...

ten sposób nowy widok byłby częścią sowne i przewijać się z nim lub pojawić/znikania lub cokolwiek robisz do stołu. Możesz zmienić jego ukrytą własność, jeśli potrzebujesz zachowania warunkowego.

Z drugiej strony, jeśli chcesz widok nagłówka ruszać, jak przewija stołowych, to lepiej, aby stół mniejszy i umieścić nagłówek nad nim jak sugerowano w innych odpowiedzi ...

57

Można użyć metod UITableViewDelegate, aby utworzyć niestandardowy widok nagłówka dla tabeli i określić wysokość, a mianowicie tableView:viewForHeaderInSection: i tableView:heightForHeaderInSection:. Możesz dodać, co chcesz do widoku. Oto przykład, który dodaje prawo wyrównany 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

w ios7, 'UITextAlignment' jest przestarzałe, użyj' NSTextAlignment' zamiast –

+0

Dzięki @indienchild - Zaktualizowałem go dla ARC i iOS 7. –

+1

Dziękuję ... !!!! –

0

lubię odpowiedź od noodl_es (upvoted), ponieważ zapewnia funkcjonalność i zachowań chcesz, ale nie trzeba się martwić o zmianę rozmiaru UITableView: który jest obsługiwany automatycznie. Jednak rozwiązanie najlepiej nadaje się tylko wtedy, gdy informacje w nagłówku odnoszą się konkretnie do pierwszej sekcji tabeli (lub jeśli tabela ma tylko jedną sekcję). Jeśli tabela ma więcej niż jedną sekcję, nagłówek drugiej sekcji odsunie nagłówek pierwszej sekcji, gdy przewinie się w górę, a zatem widok nagłówka nie będzie wyglądał tak, jakby dotyczył całej tabeli.

+0

Dzięki za przegraną! Nie możesz użyć zmiennej section, aby określić, w których sekcjach pojawiają się niestandardowe widoki nagłówków? –

+1

@ noodl_es Myślę, że OP próbował dodać widok statyczny ("nagłówek") w tym sensie, że ten sam widok powinien być widoczny niezależnie od tego, jak tabela jest przewijana. Rozumiem, że widok powinien być w dużej mierze niezależny od widoku tabeli, więc byłoby to kwestią dodania niezależnego UIView powyżej UITableView. Mogę się mylić, to jest dawno, dawno temu (zajęło mi to 5 minut, aby rozpoznać, co tu napisałem :-) – rene

0

Załóżmy, aby mieć swój UITableViewController

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

i xib z wami proste UITableView jeszcze zdefiniowane w nim można zrobić jak Mihir mówi przesłanianie metody loadView takiego:

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

} 

.. .i to wszystko. Masz UITableView ze stałym nagłówkiem i stopką.

PS. Możesz teraz używać niestandardowych widoków Xib jako widoków nagłówka i stopki.

+0

f.origin.y + = headerView.frame.size.height/2; ? Myślę, że nie jest podzielony przez dwa, to jest ** f.origin.y + = headerView.frame.size.wysokość; ** – SpaceDog

0

Found a solution at iphonedevsdk

Zamiast robić to:

[tableViewController.view addSubview:viewSubclass]; 

zrobić

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

I wreszcie rozwiązał ten problem w odpowiedni sposób, nie zmieniając klasę bazową. Jedna odpowiedź, aby dodać widok do macierzystego kontrolera nawigacji, jest przyjemna, ale przejścia wyglądają okropnie.

Naprawienie jest naprawdę łatwe. Sztuką jest stworzenie niestandardowego ustawiacza i gettera dla właściwości self.tableView. Następnie, w loadView, zamieniasz widok na nowy UIView i dodajesz do niego tableView. Wtedy możesz dodawać subviews wokół tableView. Oto jak to zrobić:

W nagłówku:

@interface CustomTableViewController : UITableViewController 
{ 
    UITableView *tableView; 
} 

W .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]; 
} 

Enjoy!

+0

To jest niesamowite! Dzięki za tę przydatną wskazówkę !! – SparkyNZ

+0

Po prostu rysuje dla mnie czarny ekran na iOS 6. –

Powiązane problemy