web-dev-qa-db-fra.com

Comment définir la hauteur de l'en-tête de la table dans UITableView?

J'ai consulté la documentation Apple sur la classe UITableView et la référence du délégué, mais je n'ai pas trouvé le moyen de définir explicitement la hauteur de l'en-tête de la table.

Je règle la hauteur des cellules de la table en utilisant le délégué suivant:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

et définissez la hauteur de l'en-tête de section/pied de page à l'aide des délégués suivants.

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section

Quelqu'un pourrait-il m'aider à définir la hauteur de l'en-tête et du pied de page?

Merci.

64
applefreak

Il suffit de définir la propriété frame de la tableHeaderView.

57
Roger

J'ai trouvé un hack sympa. Ajoutez la ligne ci-dessous après avoir modifié la propriété du cadre

self.tableView.tableHeaderView = self.tableView.tableHeaderView;

L'astuce est (je pense) que UITableView met en cache la hauteur (le cadre en fait) lorsque vous affectez la vue à la propriété tableHeaderView. La ligne ci-dessus assigne à nouveau la hauteur.

56
bcd
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    sizeHeaderToFit()
}

private func sizeHeaderToFit() {
    let headerView = tableView.tableHeaderView!

    headerView.setNeedsLayout()
    headerView.layoutIfNeeded()

    let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
    var frame = headerView.frame
    frame.size.height = height
    headerView.frame = frame

    tableView.tableHeaderView = headerView
}

Plus de détails peuvent être trouvés ici

33
Kris

Si vous en avez toujours besoin, avez-vous essayé de définir la propriété

self.tableView.tableHeaderView 

Si vous calculez la hauteur dont vous avez besoin et définissez une nouvelle vue pour tableHeaderView:

CGRect frame = self.tableView.tableHeaderView.frame;
frame.size.height = newHeight;

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:frame];

Ça devrait marcher.

8
Fabio

Cela ne fonctionne avec moi que si je règle d'abord le pied de page/l'en-tête de la table à nil:

self.footer = self.searchTableView.tableFooterView;
CGRect frame = self.footer.frame;
frame.size.height = 200;
self.footer.frame = frame;
self.searchTableView.tableFooterView = nil;
self.searchTableView.tableFooterView = self.footer;

Assurez-vous que self.footer est une référence solide pour empêcher la désallocation de la vue du pied de page.

5
Hossam Ghareeb

Swift 4 - vous pouvez gérer la hauteur avec HEIGHT_VIEW, Ajoutez simplement ce code, ça marche

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let HEIGHT_VIEW = 60
    tableView.tableFooterView?.frame.size = CGSize(width: tblView.frame.width, height: CGFloat(HEIGHT_VIEW))

    tableView.tableHeaderView?.frame.size = CGSize(width:tblView.frame.width, height: CGFloat(HEIGHT_VIEW))
}
3
Krunal Patel

Créez simplement une vue Footer Wrapper à l'aide du constructeur UIView(frame:_) Si vous utilisez un fichier xib pour FooterView, créez une vue à partir de xib et ajoutez-la en tant que sous-vue à la vue wrapper. puis assignez wrapper à tableView.tableFooterView = fixWrapper

    let fixWrapper = UIView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 54)) // dont remove
    let footer = UIView.viewFromNib("YourViewXibFileName") as! YourViewClassName
    fixWrapper.addSubview(footer)
    tableView.tableFooterView = fixWrapper
    tableFootterCostView = footer

Cela fonctionne parfaitement pour moi! le but est de créer une vue de pied de page avec le constructeur (frame:_). Même si vous créez UIView () et assignez la propriété frame, cela peut ne pas fonctionner.

1
Sergey Sahakyan

Si vous définissez la tableHeaderView par programme, placez-la simplement dans viewDidLayoutSubviews.

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        setupTableViewHeader()
    }

    private func setupTableViewHeader() {
        // Something you do to set it up programatically...
        tableView.tableHeaderView = MyHeaderView.instanceFromNib() 
    }

Si vous ne l'avez pas défini par programme, vous devez faire la même chose que ce que @Kris a répondu à partir de ceci lien

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        sizeHeaderToFit()
    }

    private func sizeHeaderToFit() {
        if let headerView = tableView.tableHeaderView {
            headerView.setNeedsLayout()
            headerView.layoutIfNeeded()

            let height = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
            var frame = headerView.frame
            frame.size.height = height
            headerView.frame = frame

            tableView.tableHeaderView = headerView
        }
    }

0
meow2x

Si vous utilisez XIB pour headerView principal de tableView, vous pouvez définir XIB en tant que forme libre, définir la hauteur à votre guise et désélectionner les blocs supérieur, inférieur et les flèches supérieure et inférieure d'Autotizing .

0
Talip Böke

Vous pouvez créer un UIView avec la hauteur désirée (la largeur doit être celle de UITableView) et à l'intérieur, vous pouvez placer un UIImageView avec l'image aux dimensions appropriées: elles ne s'étireront pas automatiquement.

Vous pouvez également donner une marge au-dessus et au-dessous de UIImageView intérieur, en donnant une hauteur supérieure à la vue conteneur.

En outre, vous pouvez affecter une transformation de traduction afin de placer l'image au milieu de la vue d'en-tête de conteneur, par exemple.

0
Gabriel

Si vous ajoutez une vue en tant qu'en-tête de tableau dans IB, définissez le cadre de cette vue dans IB dans l'onglet 5 (inspecteur de taille)

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

ou vous pouvez utiliser comme ça aussi

tableView.estimatedSectionHeaderHeight 
0
Mnsd