Je souhaite centrer le contenu de ma UITableView
qui contient headerView
et footerView
créé dans le storyboard, et UITableViewCell
s. Comment puis-je atteindre cet objectif?
Voici ce que j'essaie de mettre en œuvre pour résoudre mon problème, mais cela ne fonctionne pas.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
CGFloat height = self.tableView.frameHeight - self.navigationController.navigationBar.frameHeight - [UIApplication sharedApplication].statusBarFrame.size.height - (self.rowCount * self.rowHeight);
self.tableView.tableHeaderView.frameHeight = height / 2.0;
}
J'ai donc soustrait la hauteur de la barre de navigation et de la barre de statut et la hauteur des cellules à la hauteur de la table pour obtenir la hauteur de la zone vide. Maintenant que j'ai la hauteur si la zone est vide, je l'ai divisée en 2 pour les vues de pied de page et d'en-tête.
Dans les fonctions viewWillAppear et didRotateFromInterfaceOrientation :
CGFloat headerHeight = (self.view.frame.size.height - (ROW_HEIGHT * [self.tableView numberOfRowsInSection:0]))) / 2;
self.tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, -headerHeight, 0);
Cela résoudra votre problème.
MODIFIER
Appelez la fonction updateTableViewContentInset dans le viewWillLayoutSubviews et après chaque reloadData :
Objectif-C
- (void)updateTableViewContentInset {
CGFloat viewHeight = self.view.frame.size.height;
CGFloat tableViewContentHeight = self.tableView.contentSize.height;
CGFloat marginHeight = (viewHeight - tableViewContentHeight) / 2.0;
self.tableView.contentInset = UIEdgeInsetsMake(marginHeight, 0, -marginHeight, 0);
}
Swift 4
func updateTableViewContentInset() {
let viewHeight: CGFloat = view.frame.size.height
let tableViewContentHeight: CGFloat = tableView.contentSize.height
let marginHeight: CGFloat = (viewHeight - tableViewContentHeight) / 2.0
self.tableView.contentInset = UIEdgeInsets(top: marginHeight, left: 0, bottom: -marginHeight, right: 0)
}
Remplacez viewDidLayoutSubviews
et comparez la frame
de tableView avec sa contentSize
afin de définir sa contentInset
. Dans Swift 4:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let tableViewHeight = self.tableView.frame.height
let contentHeight = self.tableView.contentSize.height
let centeringInset = (tableViewHeight - contentHeight) / 2.0
let topInset = max(centeringInset, 0.0)
self.tableView.contentInset = UIEdgeInsets(top: topInset, left: 0.0, bottom: 0.0, right: 0.0)
}
Cela fonctionne bien avec les cellules d'affichage de la table à dimensionnement automatique ????
Swift 3 basé sur la réponse Pipiks
let headerHeight: CGFloat = (view.frame.size.height - CGFloat(Int(tableView.rowHeight) * tableView.numberOfRows(inSection: 0))) / 2
tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, -headerHeight, 0)
Utilisez la propriété contentSize
de UITableView
, ce qui vous évitera de prendre en compte la cellule height
ou count
.
- (void) updateTableInsetsForHeight: (CGFloat) height
{
CGFloat tableViewInset = MAX((height - self.tableView.contentSize.height) / 2.0, 0.f);
self.tableView.contentInset = UIEdgeInsetsMake(tableViewInset, 0, -tableViewInset, 0);
}
Mettez à jour la contentInsets
après le rechargement de tableView
- data et lorsque la vue contenant la tableView
devient visible (viewWillAppear:
) et lorsqu'elle change de taille (viewWillTransitionToSize:withTransitionCoordinator:
).
- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[self updateTableInsetsForHeight: size.height];
}
pour Swift 3:
var headerHeight: CGFloat = (tableView.frame.size.height - CGFloat(Int(tableView.rowHeight) * tableView.numberOfRows(inSection: 0))) / 2
if headerHeight > 0 {
tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, 0/*-headerHeight*/, 0)
} else {
headerHeight = 0
tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, 0/*-headerHeight*/, 0)
}
RÉSULTAT:
Ajoutez une UIView
en haut (UIView doit être le parent de votre tableView) de votre TableView
à partir du storyboard. Après cela, définissez ses contraintes pour remplir la vue. Maintenant, définissez la taille de votre TableView et définissez ses contraintes pour centrer verticalement et horizontalement votre UIView
supérieur. Cela résoudra votre problème.
J'ai découvert ce qui cause mon calcul faux. La valeur de self.tableView.bounds.size.height est différente de la hauteur réelle dans viewWillAppear. J'ai utilisé self.view.bounds.size.height à la place.