web-dev-qa-db-fra.com

Comment aligner verticalement (au centre) le contenu de UITableView?

Je souhaite centrer le contenu de ma UITableView qui contient headerView et footerView créé dans le storyboard, et UITableViewCells. 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.

9
Xchord

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)
}
23
Pipiks

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 ????

3
Axel Guilmin

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)
2
GregP

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];
}
2
Aerows

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:

 enter image description here  enter image description here  enter image description here  enter image description here

0
dory daniel

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.

0
Ersin Sezgin

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.

0
Xchord