69 votes

Comment déterminer la hauteur de UIWebView en fonction du contenu, dans une hauteur variable UITableView?

Je suis en train de créer un UITableView avec la variable de la hauteur des lignes, comme expliqué dans la réponse à cette question

Mon problème est que chaque cellule contient un UIWebView différentes (de manière statique chargé) contenu je ne peux pas comprendre comment calculer la bonne hauteur en fonction du contenu. Est-il un moyen de faire cela? J'ai essayé des choses comme ceci:

   (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
       WebViewCell *cell = (WebViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];
       [cell setNeedsLayout];
       [cell layoutIfNeeded];
       return cell.bounds.size.height;
    }

Les cellules elles-mêmes sont chargés à partir d'une plume, qui est simplement un UITableViewCell contenant un UIWebView. (Il serait aussi bien si les cellules réglé eux-mêmes la plus grande du contenu html, bien que variable de la hauteur serait plus agréable).

77voto

duncanwilcox Points 2923

Ce code est probablement trop lent pour l'utilisation de la vue tableau, mais fait l'affaire. UIWebView n'offre aucun accès direct au DOM.

Dans le viewDidLoad un contrôleur de vue, je charge du code HTML dans une vue Web et une fois le chargement terminé, lancez du javascript pour renvoyer la hauteur de l'élément.

 - (void)viewDidLoad
{
    [super viewDidLoad];
    webview.delegate = self;
    [webview loadHTMLString:@"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"];
    NSLog(@"height: %@", output);
}
 

28voto

Unfalkster Points 578

J'ai été très heureux de trouver des réponses à vos questions, le javascript truc a bien fonctionné pour moi.

Cependant, je voulais dire qu'il y a aussi le "sizeThatFits:" la méthode :

CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)];

Nous devons définir une taille différente de zéro, mais en dehors de cela, il fonctionne toujours !

Habituellement, car avec le UIWebViews, elle ne semble fonctionner que sur le deuxième chargement (j'utilise le "loadHTMLString:" la méthode, et oui j'appelle la "sizeThatFits:" le délégué "didFinishLoad:" la méthode).

Donc, c'est pourquoi j'ai été très heureux de trouver votre solution qui fonctionne dans tous les cas.

6voto

Dave Batton Points 2024

Cela semble fonctionner. Pour l'instant.

 - (void)webViewDidFinishLoad:(UIWebView *)webView
{
    CGFloat webViewHeight = 0.0f;
    if (self.subviews.count > 0) {
        UIView *scrollerView = [self.subviews objectAtIndex:0];
        if (scrollerView.subviews.count > 0) {
            UIView *webDocView = scrollerView.subviews.lastObject;
            if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]])
                webViewHeight = webDocView.frame.size.height;
        }
    }
}
 

Il doit retourner 0 en toute sécurité s'il échoue.

4voto

Ortwin Gentz Points 15102

Le problème avec -sizeThatFits: , c'est qu'il ne fonctionne pas de la case, au moins sur iOS 4.1. Elle retourne la taille actuelle de la webView (peu importe si elle est appelée avec CGSizeZero ou un arbitraire de taille non nulle).

J'ai trouvé que ça fonctionne vraiment si vous réduisez la hauteur du cadre de la webView avant d'appeler, -sizeThatFits:.

Voir ma solution: http://stackoverflow.com/questions/3936041/how-to-determine-the-content-size-of-a-uiwebview

3voto

Daij-Djan Points 18696

mesurer une webview fonctionne, mais seulement quand il a chargé son contenu

  • faire une webview petite (comme 5px)
  • chargez-le et attendez la fin
  • appelant sizeToFit dessus puis
  • obtenir la taille ALORS
  • recharger la table (retourner la hauteur correcte pour la cellule)

advertisement:: D voir ma classe M42WebviewTableViewCell sur github qui lutte avec cela

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