Je rencontre des difficultés pour redimensionner une tableHeaderView. Cela ne fonctionne pas simplement.
1) Créez un UITableView et UIView (100 x 320 px);
2) Définissez l'UIView comme tableHeaderView de UITableView;
3) Construisez et partez. Tout va bien.
Maintenant, je veux redimensionner le tableHeaderView, donc j'ajoute ce code dans 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;
La hauteur de tableHeaderView doit apparaître avec 200, mais apparaît avec 100.
Si j'écris:
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;
Ensuite, ça commence par 200 de hauteur, comme je veux. Mais je veux pouvoir le modifier en cours d'exécution.
J'ai aussi essayé ceci, sans succès:
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];
Le point ici est: Comment redimensionner une tableHeaderView au runtime ???
Quelqu'un est-il capable de faire cela?
Merci
iMe
[tableView recalculateHeaderHeight]
chaque fois.setTableHeaderView:
appel avec[tableview beginUpdates]
et[tableview endUpdates]
Cette réponse est ancienne et ne fonctionne apparemment pas sur iOS 7 et supérieur.
J'ai rencontré le même problème et je voulais également que les modifications s'animent, j'ai donc créé une sous-classe de UIView pour ma vue d'en-tête et ajouté ces méthodes:
Cela anime essentiellement toutes les sous-vues de UITableView qui ne sont pas du même type de classe que la classe appelante. À la fin de l'animation, il appelle setTableHeaderView sur le superview (l'UITableView) - sans cela, le contenu de UITableView reviendra la prochaine fois que l'utilisateur fera défiler. La seule limitation que j'ai trouvée à ce sujet jusqu'à présent est que si l'utilisateur tente de faire défiler l'UITableView pendant que l'animation est en cours, le défilement s'animera comme si la vue d'en-tête n'avait pas été redimensionnée (ce qui n'est pas grave si l'animation est rapide).
la source
Si vous souhaitez animer les modifications de manière conditionnelle, vous pouvez effectuer les opérations suivantes:
Veuillez noter que l'animation est double:
tableHeaderView
. Ceci est fait en utilisantbeginUpdates
etendUpdates
UIView
bloc d'animation.Afin de synchroniser ces deux animations, le
animationCurve
doit être défini surUIViewAnimationCurveEaseInOut
et la durée sur0.3
, ce qui semble être ce que UITableView utilise pour son animation.Mettre à jour
J'ai créé un projet Xcode sur gihub, qui fait cela. Découvrez le projet
ResizeTableHeaderViewAnimated
dans besi / ios-quickiesla source
Je pense que cela devrait fonctionner si vous définissez simplement la hauteur de myHeaderView comme suit:
la source
Utilisation de la solution @garrettmoon ci-dessus jusqu'à iOS 7.
Voici une solution mise à jour basée sur @ garrettmoon:
la source
Cela a fonctionné pour moi sur iOS 7 et 8. Ce code s'exécute sur le contrôleur de vue de table.
la source
C'est parce que le setter de tableHeaderView.
Vous devez définir la hauteur UIView avant de définir tableHeaderView. (Ce serait beaucoup plus facile si Apple ouvrait les sources de ce cadre ...)
la source
Sur iOS 9 et les versions antérieures,
tableHeaderView
ne remettrait pas en page après le redimensionnement. Ce problème est résolu dans iOS 10.Pour résoudre ce problème, faites-le simplement avec le code suivant:
la source
Sur iOS 9.x, cela
viewDidLoad
fonctionne très bien:headerView
est déclaré@IBOutlet var headerView: UIView!
et connecté sur le storyboard, où il est placé en haut de tableView, pour fonctionner comme tableHeaderView.la source
C'est uniquement lorsque vous utilisez la mise en page automatique et que vous définissez
translatesAutoresizingMaskIntoConstraints = false
une vue d'en-tête personnalisée.Le moyen le meilleur et le plus simple est de passer outre
intrinsicContentSize
. En interneUITableView
utiliseintrinsicContentSize
pour décider de sa taille en- tête / pied de page. Une fois que vous avez remplacéintrinsicContentSize
dans votre vue personnalisée, ce que vous devez faire est comme ci-dessousinvalidateIntrinsicContentSize()
tableView.setNeedsLayout()
ettableView.layoutIfNeeded()
Ensuite, l
UITableView
'en - tête / pied de page sera mis à jour comme vous le souhaitez. Pas besoin de définir la vue nulle ou de réinitialiser.Une chose vraiment intéressante pour le
UITableView.tableHeaderView
ou.tableFooterView
est qu'ilUIStackView
perd sa capacité à gérer sonarrangedSubviews
. Si vous souhaitez utiliserUIStackView
comme tableHeaderView ou tableFooterView, vous devez intégrer le stackView dans uneUIView
et overrideUIView
« sintrinsicContentSize
.la source
Pour le code testé Swift 5
Remarque: vous devez indiquer toutes les contraintes de la sous-vue sous forme haut, bas, début, fin. Ainsi, il obtiendra toute la taille requise.
Référence tirée de: https://useyourloaf.com/blog/variable-height-table-view-header/
la source
La définition de la hauteur de la propriété de vue d'en-tête
tableView.tableHeaderView
dansviewDidLoad
ne semble pas fonctionner, la hauteur de vue d'en-tête ne change toujours pas comme prévu.Après avoir combattu ce problème pendant de nombreux essais. J'ai trouvé que vous pouvez changer la hauteur en invoquant la vue d'en-tête pour créer une logique à l'intérieur de la
- (void)didMoveToParentViewController:(UIViewController *)parent
méthode.Ainsi, l'exemple de code ressemblerait à ceci:
la source
J'ai trouvé que l'initialiseur initWithFrame d'un UIView n'honorait pas correctement le droit que je transmettais. Par conséquent, j'ai fait ce qui suit qui a parfaitement fonctionné:
L'avantage de ceci est qu'il est mieux encapsulé dans votre code de vue.
la source
UIScreen
est une mauvaise idée, comment allez-vous réutiliser votre vue?J'ai implémenté un changement de hauteur animé de l'en-tête de la table pour s'étendre à l'écran global lorsque vous appuyez dessus. Cependant, le code peut aider dans d'autres cas:
la source
En-tête de redimensionnement UITableView - UISearchBar avec Scope Bar
Je voulais un
UITableView
avec unUISearchBar
comme en-tête du tableau, donc j'ai une hiérarchie qui ressemble à ceciMéthodes UISearchBarDelegate
Comme indiqué ailleurs, si vous ne définissez pasTableViewHeader après l'avoir modifié, rien ne se passera.
la source
Si headerView personnalisé est conçu à l'aide de la mise en page automatique et que headerView doit être mis à jour après la récupération Web ou une tâche paresseuse similaire. puis dans iOS-Swift j'ai fait cela et j'ai mis à jour mon headerView en utilisant le code ci-dessous:
la source
De toute évidence, Apple devrait maintenant avoir implémenté UITableViewAutomaticDimension pour tableHeaderView & tableFooterView ...
Ce qui suit semble fonctionner pour moi en utilisant des contraint (s) de mise en page:
la source
Si votre tableHeaderView est une vue Web à contenu ajustable, vous pouvez essayer:
Je l'ai testé sur iOS9 et iOS11, a bien fonctionné.
la source
Avez-vous essayé
[self.tableView reloadData]
après avoir changé la hauteur?la source
- [UITableView reloadData]
est uniquement destiné aux vues dynamiques (cellules) et aussi à la sectionHeaders que vous pensiez évidemment signifier;)