104 votes

Comment redimensionner un tableHeaderView d’un UITableView ?

Je vais avoir des problèmes pour le redimensionnement d'un tableHeaderView. Simple ne fonctionne pas.

1) Créer un UITableView et UIView (100 x 320 px);

2) Définir la UIView comme tableHeaderView de la UITableView;

3) Construire et Aller de l'. Tout est ok.

Maintenant, je veux le redimensionnement de la tableHeaderView, j'ai donc ajouter ce code dans le 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 la 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;

Puis il commence avec 200 de hauteur, comme je veux. Mais je veux être capable de la modifier dans l'exécution.

J'ai aussi essayé, 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 dans runtime ???

Quelqu'un capable de faire cela?

Merci

iMe

180voto

kubi Points 20607

FYI : J’ai obtenu cela fonctionne en modifiant la tableHeaderView et re-mettre. Dans ce cas, je suis ajustant la taille de la tableHeaderView la sous-vue UIWebView fin du chargement.

12voto

garrettmoon Points 86

J'ai rencontré le même problème, et je voulais aussi les changements d'animer, j'ai donc fait une sous-classe de UIView pour mon en-tête de la vue et de l'ajout de ces méthodes:

- (void)adjustTableHeaderHeight:(NSUInteger)newHeight{
    NSUInteger oldHeight = self.frame.size.height;
    NSInteger originChange = oldHeight - newHeight;

    [UIView beginAnimations:nil context:nil];

    [UIView setAnimationDuration:1.0f];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    self.frame = CGRectMake(self.frame.origin.x, 
                        self.frame.origin.y, 
                        self.frame.size.width, 
                        newHeight);

    for (UIView *view in [(UITableView *)self.superview subviews]) {
        if ([view isKindOfClass:[self class]]) {
            continue;
        }
        view.frame = CGRectMake(view.frame.origin.x, 
                            view.frame.origin.y - originChange, 
                            view.frame.size.width, 
                            view.frame.size.height);
    }

    [UIView commitAnimations];
}

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{
    [(UITableView *)self.superview setTableHeaderView:self];
}

Essentiellement, cela anime tous les sous-vues de la UITableView qui ne sont pas le même type de classe que l'appel de la classe. À la fin de l'animation, il appelle setTableHeaderView sur le superview (UITableView) – sans cela la UITableView contenu va revenir la prochaine fois que l'utilisateur fait défiler. La seule limitation que j'ai trouvé sur cette mesure est si l'utilisateur tente de faire défiler la UITableView alors que l'animation a lieu, le défilement s'animer comme si la vue d'en-tête n'a pas été redimensionnée (pas une grosse affaire si l'animation est rapide).

11voto

Besi Points 9452

Si vous voulez conditionnellement animer les modifications que vous pouvez effectuer les opérations suivantes:

- (void) showHeader:(BOOL)show animated:(BOOL)animated{

    CGRect closedFrame = CGRectMake(0, 0, self.view.frame.size.width, 0);
    CGRect newFrame = show?self.initialFrame:closedFrame;

    if(animated){
        // The UIView animation block handles the animation of our header view
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.3];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        // beginUpdates and endUpdates trigger the animation of our cells
        [self.tableView beginUpdates];
    }

    self.headerView.frame = newFrame;
    [self.tableView setTableHeaderView:self.headerView];

    if(animated){
        [self.tableView endUpdates];
        [UIView commitAnimations];
    }
}

Veuillez noter que l'animation est en deux temps:

  1. L'animation de la cellule de dessous du tableHeaderView. Ceci est fait en utilisant beginUpdates et endUpdates
  2. L'animation de la réelle vue d'en-tête. Ceci est fait en utilisant un UIView bloc d'animation.

Afin de synchroniser ces deux animations de l' animationCurve à UIViewAnimationCurveEaseInOut et la durée d' 0.3, ce qui semble être ce que les UITableView utilise pour son animation.

Mise à jour

J'ai créé un projet Xcode sur gihub, qui ne de cette. Découvrez le projet ResizeTableHeaderViewAnimated dans besi/ios-quickies

screenshot

10voto

Greg Martin Points 3357

Je pense que cela devrait fonctionner si vous venez de mettre la hauteur de myHeaderView comme suit :

6voto

avishic Points 1295

Utilisé @garrettmoon solution ci-dessus jusqu'à iOS 7.
Voici une solution de mise à jour issue de @garrettmoon :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X