web-dev-qa-db-fra.com

Comment implémenter `viewForHeaderInSection` sur le style iOS7?

Comment implémenter (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section sur le style iOS7 comme (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section travaux?

P.S. J'ai juste besoin de changer la couleur du titre de l'en-tête du UITableView et de sauvegarder son style.

22
Dmitry

Vous pouvez changer la couleur d'une étiquette à l'intérieur d'un en-tête tableview standard avant le rendu avec willDisplayHeaderView. Fonctionne également pour iOS6/iOS7.

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    if([view isKindOfClass:[UITableViewHeaderFooterView class]]){

        UITableViewHeaderFooterView *tableViewHeaderFooterView = (UITableViewHeaderFooterView *) view;
        tableViewHeaderFooterView.textLabel.textColor = [UIColor blueColor];
    }
}

Pour référence

UITableViewHeaderFooterView : https://developer.Apple.com/documentation/uikit/uitableviewheaderfooterview

Protocole UITableViewDelegate : https://developer.Apple.com/documentation/uikit/uitableviewdelegate/1614905-tableview

52
aumansoftware

Si vous devez modifier la couleur globale de l'en-tête et du pied de page, utilisez appearance:

[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setTextColor:[UIColor redColor]];
8
onegray

Au début du cycle de vie de votre contrôleur de vue (par exemple, -viewDidLoad), inscrivez la classe:

 [[self tableView] registerClass:[UITableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"headerFooterReuseIdentifier"];

Ensuite, dans votre méthode: (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section déquez une cellule, stylisez-la comme vous le souhaitez et retournez-la:

 UIColor *titleColor = ... // Your color here.
 UITableViewHeaderFooterView *headerFoorterView = [[self tableView] dequeueReusableHeaderFooterViewWithIdentifier:@"headerFooterReuseIdentifier"];
 [[headerFooterView textLabel] setTextColor:titleColor];
 return headerFooterView;

Et c'est ainsi que vous utilisez une implémentation par défaut.

6
isaac

Pas parfait mais solution:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UILabel *label = [[UILabel alloc] init];
    label.textColor = [UIColor whiteColor];
    label.backgroundColor = [UIColor clearColor];
    if (<is_iOS7>) {
        label.text = [[NSString stringWithFormat:@"  %@", <title>] uppercaseString];
    } else {
        if (<is_iPad>) {
            label.text = [NSString stringWithFormat:@"          %@", <title>];
        } else {
            label.text = [NSString stringWithFormat:@"  %@", <title>];
        }
    }
    return label;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 38.f;
}
3
Dmitry

Et la réponse de @ aumansoftware est également le meilleur moyen d'ajouter du contenu dans l'en-tête standard tel qu'un bouton. Voici un exemple dans Swift:

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if (view.isKindOfClass(UITableViewHeaderFooterView)) {
        let headerView = view as UITableViewHeaderFooterView

        // Label
        headerView.textLabel.textColor = UIColor.blueColor()

        // New Button
        let addPeopleButton: UIButton = UIButton.buttonWithType(.ContactAdd) as UIButton
        addPeopleButton.addTarget(self, action: "showPeoplePicker:", forControlEvents: UIControlEvents.TouchUpInside)

        addPeopleButton.setTranslatesAutoresizingMaskIntoConstraints(false)
        headerView.addSubview(addPeopleButton)
        let right: NSLayoutConstraint = NSLayoutConstraint(item: addPeopleButton, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.Right, multiplier: 1.0, constant: -12)
        let vertical: NSLayoutConstraint = NSLayoutConstraint(item: addPeopleButton, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterY, multiplier: 1.0, constant: 0)
        headerView.addConstraints([right, vertical])
    }
}
1
Jeff Collier

Il fonctionne exactement comme dans iOS 6. Créez une vue (ou simplement une étiquette qui couvre l'intégralité de l'en-tête) et stylisez-la selon vos besoins.

0
Mundi