Como o design das visualizações de tabela usando o estilo agrupado mudou consideravelmente com o iOS 7, gostaria de ocultar (ou remover) o primeiro cabeçalho da seção. Até agora não consegui.
Um pouco simplificado, meu código fica assim:
- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (section == 0)
return 0.0f;
return 32.0f;
}
- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
if (section == 0) {
UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
return view;
}
return nil;
}
- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
if (section == 0) {
return nil;
} else {
// return some string here ...
}
}
Se eu retornar uma altura de 0, os outros dois métodos nunca serão chamados com o índice de seção 0. Mesmo assim, um cabeçalho de seção vazio ainda é desenhado com a altura padrão. (No iOS 6, os dois métodos são chamados. No entanto, o resultado visível é o mesmo.)
Se eu retornar um valor diferente, o cabeçalho da seção obtém a altura especificada.
Se eu retornar 0,01, é quase correto. No entanto, quando eu ligo "Color Misaligned Images" no simulador, ele marca todas as células de visualização da tabela (o que parece ser uma consequência lógica).
As respostas à pergunta UITableView: ocultar o cabeçalho da seção vazia parecem indicar que algumas pessoas tiveram sucesso em ocultar o cabeçalho da seção. Mas pode se aplicar ao estilo simples (em vez do agrupado).
O melhor compromisso até agora é retornar a altura 0,5, resultando em uma linha um pouco mais grossa abaixo da barra de navegação. No entanto, agradeceria se alguém souber como o cabeçalho da primeira seção pode ser completamente oculto.
Atualizar
De acordo com a análise de caglar ( https://stackoverflow.com/a/19056823/413337 ), o problema só surge se a visualização da tabela estiver contida em um controlador de navegação.
fonte
section == 0
.Respostas:
Tenho uma solução alternativa que me parece razoavelmente limpa. Portanto, estou respondendo à minha própria pergunta.
Visto que 0 como a altura do cabeçalho da primeira seção não funciona, eu retorno 1. Em seguida, uso o contentInset para ocultar essa altura abaixo da barra de navegação.
Objective-C:
Rápido:
fonte
CGFLOAT_MIN
vez de um valor embutido em código. Em outras palavras, não façareturn 1.0f
ou0.1f
, em vez disso,return CGFLOAT_MIN
se a Apple alguma vez alterar o valor mínimo aceitável, você terá o código a ser alterado se codificar o valor de retorno. Além disso, você ainda não sabe se está usando o menor valor possível. Usando a constante definida, você tem a garantia de usar o menor valor possível e seu código sobreviverá às alterações do sistema operacional.Esta é a forma de ocultar o cabeçalho da primeira seção em UITableView (estilo agrupado).
Solução Swift 3.0 e Xcode 8.0
O delegado do TableView deve implementar o método heightForHeaderInSection
Dentro do método heightForHeaderInSection, retorne o número menos positivo. (não zero!)
fonte
CGFLOAT_MIN
for objc é idêntico aCGFloat.leastNonzeroMagnitude
em SwiftA resposta foi muito engraçada para mim e para minha equipe, e funcionou perfeitamente
RAZÃO:
Observamos que isso acontece apenas para a Primeira Visualização na Hierarquia de Visualização, se esta primeira visualização for uma UITableView . Portanto, todos os outros UITableViews semelhantes não têm essa seção chata, exceto a primeira. Tentamos remover o UITableView do primeiro lugar na hierarquia de visualizações e tudo estava funcionando conforme o esperado.
fonte
contentInset
para, por exemplo,{0, 64, 0, 0}
para ter o deslocamento de 64px do topo (barra de status mais barra de navegação). O the tableView precisa ser anexado ao topo da tela, não o topLayoutGuide (para deixá-lo alcançar sob a barra de navegação)Use este truque para o tipo agrupado tableView
Copie e cole o código abaixo para sua visualização de tabela no método viewDidLoad :
fonte
_tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 1)]
.desta forma está OK.
fonte
Acabei de copiar seu código e tentei. Funciona normalmente (experimentado no simulador). Anexei a visualização do resultado. Você quer essa visão, certo? Ou eu entendi mal o seu problema?
fonte
Swift3: heightForHeaderInSection funciona com 0, você só precisa ter certeza de que o cabeçalho está definido como clipsToBounds.
se você não definir clipsToBounds, o cabeçalho oculto ficará visível durante a rolagem.
fonte
Atualização [19/09/17]: A resposta antiga não funciona mais para mim no iOS 11. Obrigado, Apple. O seguinte fez:
Resposta Anterior:
Conforme postado nos comentários de Chris Ostomo, o seguinte funcionou para mim:
fonte
Aqui está como se livrar do cabeçalho da seção superior em um UITableView agrupado, em Swift:
fonte
No Swift 4.2 e em muitas versões anteriores, em vez de definir a altura do primeiro cabeçalho como 0, como nas outras respostas, você pode apenas definir os outros cabeçalhos como
nil
. Digamos que você tenha duas seções e só queira que a segunda (ou seja,1
) tenha um cabeçalho. Esse cabeçalho terá o texto Foobar :fonte
Tente isto se quiser remover todo o cabeçalho da seção completamente
fonte
Não posso comentar ainda, mas pensei em acrescentar que, se você tiver um
UISearchController
no seu controlador comUISearchBar
como seutableHeaderView
, definir a altura da primeira seção como 0 dentroheightForHeaderInSection
realmente funciona.Eu uso
self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);
para que a barra de pesquisa fique oculta por padrão.O resultado é que não há cabeçalho para a primeira seção e rolar para baixo exibirá a barra de pesquisa logo acima da primeira linha.
fonte
De longe, o mais fácil é retornar
nil
ou""
entrarfunc tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
em uma seção onde você não deseja exibir o cabeçalho.fonte
Versão Swift: Swift 5.1
Geralmente, você pode definir a altura no delegado tableView assim:
Às vezes, quando você cria UITableView com Xib ou Storyboard, a resposta de up não funciona. você pode tentar a segunda solução:
Espero que funcione para você!
fonte