Adicionando o iOS UITableView HeaderView (não o cabeçalho da seção)

167

Quero adicionar um cabeçalho de tabela (não cabeçalhos de seção), como no aplicativo de contatos, por exemplo: insira a descrição da imagem aqui

exatamente assim - um rótulo ao lado de uma imagem acima da tabela.

Quero que a exibição em todos seja rolável, para que não seja possível colocá-las fora da mesa.

Como eu posso fazer isso?

Assaf b
fonte

Respostas:

245

UITableViewtem uma tableHeaderViewpropriedade Defina isso para qualquer visualização que você queira lá em cima.

Use um novo UIViewcomo um contêiner, adicione um rótulo de texto e uma visualização de imagem a essa nova UIViewe defina tableHeaderViewa nova visualização.

Por exemplo, em um 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];
     // ...
} 
peterjb
fonte
Ótimo! Obrigado, está funcionando. Existe alguma propriedade de fazer com que as células da tableview cresçam do tamanho do texto?
Assaf b 26/03
Para fazer isso, você precisa calcular a altura da célula com uma string e passar esse valor para heightForRowAtIndexPath. Você pode usar o método sizeWithFont: constrainedToSize: da função NSString para descobrir a altura do texto quando restrito a um tamanho.
Mark
Adicione-o após o layout, ou seu tamanho não será o desejado. E o viewDidLoad é um bom lugar.
BollMose
É uma boa prática definir a geometria da vista na fase viewDidLoad?
Nandish A
1
ok se você definir a exibição do cabeçalho na fonte tabelas parece funcionar, certifique-se de definir a altura, bem como: exemplo:public override UIView GetViewForHeader(UITableView tableView, nint section) { return headerView; } public override nfloat GetHeightForHeader(UITableView tableView, nint section) { return headerView.Frame.Height; }
panthor314
193

Você pode fazer isso com bastante facilidade no Interface Builder. Basta criar uma vista com uma tabela e soltar outra vista na mesa. Isso se tornará a visualização do cabeçalho da tabela. Adicione seus rótulos e imagem a essa exibição. Veja a foto abaixo para a hierarquia de visualizações. Exibir hierarquia no Interface Builder

Kirby Todd
fonte
12
Eu prefiro esta resposta, uma vez por que escrever código quando eu posso perfeitamente configurá-lo e posicioná-lo no IB
Besi
1
incrível obrigado pela dica. BTW, você não precisa de uma exibição de rolagem no cabeçalho, caso mais alguém esteja se perguntando ou tentando isso. Ele usa o ScrollView do UITableView para o seu cabeçalho, uma vez que o cabeçalho é tecnicamente parte do UITableView
Rob R.
2
Vale a pena mencionar como ele funciona no editor StoryBoard agora: stackoverflow.com/q/7841167/926907
Dmitry Zaytsev
Não use uma ponta para isso. Leva mais tempo para carregar. Escreva em código. Para reutilização criar uma classe personalizada e instanciar ...
Charles Robertson
1
Não me permitirá adicionar uma restrição de altura à visualização do cabeçalho.
Ian Warburton
14

Em Swift :

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
}
O rei da bruxaria
fonte
O uso dessa abordagem para o iOS 7 ou superior acionará um aviso de tempo de execução: "nenhum caminho de índice para a célula da tabela sendo reutilizada". Para evitar esse erro, link de
baskInEminence
11

Você também pode simplesmente criar SOMENTE um UIView no construtor Interface e arrastar e soltar o ImageView e o UILabel (para torná-lo parecido com o cabeçalho desejado) e usá-lo.

Quando o seu UIView também se parecer com o desejado, você pode inicializá-lo programaticamente a partir do XIB e adicionar ao seu UITableView. Em outras palavras, você não precisa criar a tabela INTEIRO no IB. Apenas o headerView (dessa forma, a visualização do cabeçalho também pode ser reutilizada em outras tabelas)

Por exemplo, eu tenho um UIView personalizado para um dos meus cabeçalhos de tabela. A visualização é gerenciada por um arquivo xib chamado "CustomHeaderView" e é carregada no cabeçalho da tabela usando o seguinte código na minha subclasse 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;
}
iansari
fonte
-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;

}
Priyam
fonte
Não entendeu sua pergunta?
Priyam
2
Isto está errado. Ele quer apenas um cabeçalho de tabela única, NÃO um cabeçalho de seção. As duas coisas são muito diferentes. Por favor, leia a pergunta.
Charles Robertson