ios - É possível obter uma altura de cabeçalho de seção de exibição de tabela dinâmica usando o Layout automático?




uitableview ios8 (6)

Eu modifiquei a answer . Acabou de substituir o método viewWillAppear:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 25


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.layoutIfNeeded() 
}

Adicione também tableView.layoutIfNeeded () a

override func viewDidAppear(_ animated: Bool) {

    super.viewDidAppear(animated)
    tableView.layoutIfNeeded()
}

Para iOS 10

tableView.beginUpdates()
tableView.endUpdates()

ter efeito de animação "desaparecer" em viewWillAppear para mim

Novidade no iOS 8, você pode obter células 100% dinâmicas de exibição de tabela simplesmente configurando a altura estimada da linha e depois layout seus elementos na célula usando o Layout automático. Se o conteúdo aumentar em altura, a célula também aumentará em altura. Isso é extremamente útil e estou imaginando se o mesmo feito pode ser realizado para cabeçalhos de seção em uma exibição de tabela?

Por exemplo, é possível criar uma UIView em tableView:viewForHeaderInSection: adicionar uma tableView:viewForHeaderInSection: UILabel , especificar restrições de layout automático para o rótulo na visualização e aumentar a altura da visualização para ajustar-se ao conteúdo do rótulo, sem a necessidade de implementar o tableView:heightForHeaderInSection: :?

A documentação para viewForHeaderInSection declara: "Este método só funciona corretamente quando tableView: heightForHeaderInSection: também é implementado." Não ouvi se alguma coisa mudou para o iOS 8.

Se não se pode fazer isso, qual é a melhor maneira de imitar esse comportamento?


Fiquei preso no mesmo problema em que o cabeçalho estava obtendo altura zero até a menos que eu forneça uma altura fixa no delegado para heighForHeaderInSection .

Tentei muitas soluções que incluem

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

Mas nada funcionou. Meu celular também estava usando pagamentos automáticos adequados. As linhas estavam mudando de altura dinamicamente usando o código a seguir, mas o cabeçalho da seção não estava.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.beginUpdates()
    tableView.endUpdates()
}

A correção também é extremamente simples e estranha, mas eu tive que implementar os métodos delegados em vez de 1 código de linha para o estimatedSectionHeaderHeight e sectionHeaderHeight , como segue no meu caso.

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 73`

Isso pode ser conseguido definindo (ou retornando) o estimatedSectionHeaderHeight na exibição da tabela.

Se o cabeçalho da seção se sobrepuser às células após a configuração de estimatedSectionHeaderHeight , verifique se você também está usando um estimatedRowHeight .

(Estou adicionando esta resposta porque o segundo parágrafo contém uma resposta para um problema que pode ser encontrado após a leitura de todos os comentários que alguns podem perder).


No meu caso:

  1. definir programaticamente para não funcionar .

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension .

  1. definido no storyboard não funciona .

  2. substituir heightForHeaderInSection funcionou .

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return UITableViewAutomaticDimension
}

ambiente de teste:

  • Mac OS 10.13.4
  • XCode versão 9.4.1
  • Simulador iPhone 8 Plus

eu tentei

self.tableView.estimatedRowHeight = 135
self.tableView.rowHeight = UITableViewAutomaticDimension`

mas não dimensionou corretamente o cabeçalho com o rótulo de várias linhas. Adicionado isto para resolver o meu problema:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return UITableViewAutomaticDimension
}

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    return 73
}

Swift 4+

trabalhando (testado 100%)

Se você precisa tanto da seção quanto da linha com altura dinâmica com base no conteúdo, pode usar o código abaixo:

Em viewDidLoad () escreva estas linhas:

    self.globalTableView.estimatedRowHeight = 20
    self.globalTableView.rowHeight = UITableView.automaticDimension

    self.globalTableView.sectionHeaderHeight =  UITableView.automaticDimension
    self.globalTableView.estimatedSectionHeaderHeight = 25;

Agora, definimos a altura da linha e a seção usando os métodos UITableView Delegate:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
   {
       return UITableView.automaticDimension
   }
   func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

       return UITableView.automaticDimension

   }




autolayout