Estou tendo problemas para redimensionar um tableHeaderView. Simplesmente não funciona.
1) Crie um UITableView e UIView (100 x 320 px);
2) Defina o UIView como tableHeaderView do UITableView;
3) Construa e vá. Está tudo bem.
Agora, quero redimensionar a tableHeaderView, então adiciono este código em viewDidLoad:
self.tableView.autoresizesSubviews = YES;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;
A altura de tableHeaderView deve aparecer com 200, mas aparece com 100.
Se eu escrever:
self.tableView.autoresizesSubviews = YES;
CGRect newFrame = myHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
myHeaderView.frame = newFrame;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
Aí começa com 200 de altura, como eu quero. Mas quero poder modificá-lo em tempo de execução.
Eu também tentei isso, sem sucesso:
self.tableView.autoresizesSubviews = YES;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;
[self.tableView.tableHeaderView setNeedsLayout];
[self.tableView.tableHeaderView setNeedsDisplay];
[self.tableView setNeedsLayout];
[self.tableView setNeedsDisplay];
O ponto aqui é: Como redimensionamos um tableHeaderView em tempo de execução ??
Alguém pode fazer isso?
obrigado
iMe
[tableView recalculateHeaderHeight]
todas as vezes.setTableHeaderView:
chamada com[tableview beginUpdates]
e[tableview endUpdates]
Esta resposta é antiga e aparentemente não funciona no iOS 7 e superior.
Encontrei o mesmo problema e também queria que as alterações fossem animadas, então criei uma subclasse de UIView para minha visualização de cabeçalho e adicionei estes métodos:
Isso essencialmente anima todas as subvisualizações do UITableView que não são do mesmo tipo de classe da classe de chamada. No final da animação, ele chama setTableHeaderView no superview (o UITableView) - sem isso, o conteúdo de UITableView voltará na próxima vez que o usuário rolar. A única limitação que encontrei sobre isso até agora é se o usuário tentar rolar o UITableView enquanto a animação está ocorrendo, a rolagem será animada como se a visualização do cabeçalho não tivesse sido redimensionada (não é grande coisa se a animação for rápido).
fonte
Se você deseja animar condicionalmente as alterações, pode fazer o seguinte:
Observe que a animação é dupla:
tableHeaderView
. Isso é feito usandobeginUpdates
eendUpdates
UIView
bloco de animação.A fim de sincronizar essas duas animações, o
animationCurve
deve ser definido paraUIViewAnimationCurveEaseInOut
e a duração para0.3
, que parece ser o que o UITableView usa para sua animação.Atualizar
Criei um projeto Xcode no gihub, que faz isso. Confira o projeto
ResizeTableHeaderViewAnimated
em besi / ios-quickiesfonte
Acho que deve funcionar se você apenas definir a altura de myHeaderView assim:
fonte
Usei a solução @garrettmoon acima até o iOS 7.
Aqui está uma solução atualizada baseada em @garrettmoon's:
fonte
Isso funcionou para mim no iOS 7 e 8. Este código está sendo executado no controlador de visualização de tabela.
fonte
É porque o configurador de tableHeaderView.
Você deve definir a altura UIView antes de definir o tableHeaderView. (Seria muito mais fácil se a Apple abrisse o código-fonte desta estrutura ...)
fonte
No iOS 9 e inferior,
tableHeaderView
o layout não seria refeito após redimensioná-lo. Este problema foi resolvido no iOS 10.Para resolver esse problema, basta fazer isso com o seguinte código:
fonte
No iOS 9.x, fazer isso
viewDidLoad
funciona perfeitamente:headerView
é declarado como@IBOutlet var headerView: UIView!
e conectado no storyboard, onde é colocado na parte superior de tableView, para funcionar como tableHeaderView.fonte
Isso é apenas para quando você usa o layout automático e definir
translatesAutoresizingMaskIntoConstraints = false
como uma visualização de cabeçalho personalizada.A melhor e mais simples maneira é substituir
intrinsicContentSize
.UITableView
Usa internamenteintrinsicContentSize
para decidir o tamanho do cabeçalho / rodapé. Depois de substituirintrinsicContentSize
sua visualização personalizada, o que você precisa fazer é o seguinteinvalidateIntrinsicContentSize()
tableView.setNeedsLayout()
etableView.layoutIfNeeded()
Então o
UITableView
cabeçalho / rodapé do será atualizado como você deseja. Não há necessidade de definir a visualização nula ou redefinir.Uma coisa realmente interessante para o
UITableView.tableHeaderView
ou.tableFooterView
é queUIStackView
perde a capacidade de gerenciar o seuarrangedSubviews
. Se você quiser usarUIStackView
como tableHeaderView ou tableFooterView, terá que incorporar stackView em umUIView
e substituirUIView
'sintrinsicContentSize
.fonte
Para código testado swift 5
Nota: Você precisa fornecer todas as restrições de subvisualização de forma superior, inferior, inicial, final. Portanto, ele terá todo o tamanho necessário.
Referência retirada de: https://useyourloaf.com/blog/variable-height-table-view-header/
fonte
Definir a altura da propriedade de visualização do cabeçalho
tableView.tableHeaderView
emviewDidLoad
não parece trabalho, a altura vista cabeçalho ainda não muda conforme esperado.Depois de lutar contra esse problema por muitas tentativas. Eu descobri que você pode alterar a altura invocando a lógica de criação da visualização do cabeçalho dentro do
- (void)didMoveToParentViewController:(UIViewController *)parent
método.Portanto, o código de exemplo seria assim:
fonte
Descobri que o inicializador initWithFrame de um UIView não honra corretamente o ret que eu transmito. Portanto, fiz o seguinte que funcionou perfeitamente:
A vantagem disso é que ele é melhor encapsulado em seu código de visualização.
fonte
UIScreen
é uma má ideia. Como você reutilizará sua visualização?Implementei a mudança de altura animada do cabeçalho da mesa para expandir para a tela geral quando tocada. No entanto, o código pode ajudar em outros casos:
fonte
Cabeçalho de redimensionamento UITableView - UISearchBar com barra de escopo
Eu queria um
UITableView
com umUISearchBar
como o cabeçalho da tabela, então tenho uma hierarquia parecida com estaMétodos UISearchBarDelegate
Como foi afirmado em outro lugar, se você não setTableViewHeader depois de alterá-lo, nada acontecerá.
fonte
Se headerView personalizado é projetado usando autolayout e headerView precisa ser atualizado após web-fetch ou tarefa preguiçosa semelhante. então no iOS-Swift eu fiz isso e atualizei meu headerView usando o código abaixo:
fonte
Obviamente, agora a Apple deveria ter implementado UITableViewAutomaticDimension para tableHeaderView & tableFooterView ...
O seguinte parece funcionar para mim usando restrição (ões) de layout:
fonte
Se seu tableHeaderView for um webView ajustável de conteúdo, você pode tentar:
Testei no iOS9 e iOS11 e funcionou bem.
fonte
Você tentou
[self.tableView reloadData]
depois de mudar a altura?fonte
- [UITableView reloadData]
destina-se apenas às visualizações dinâmicas (células) e também à seçãoHeaders que você obviamente pensou que se referiam ;)