2011-01-03 1 views
1

Je chargement de contenu dans un UIWebView avec l'appel suivant:documents UIWebView reste hauteur du contenu le plus haut

NSString *detailHtmlString = [NSString stringWithFormat:@"<html><head><style>body {background: black;color: white;line-height: 1.4em; font-family: sans-serif; margin: 0; padding: 0 0 30px 0;width: 280px;} p {margin-top: 10px;}</style></head><body id=\"content\">%@</body></html>",[currentWeek objectForKey:@"post_content"]]; 
[weekDetailController.movie_detail loadHTMLString:detailHtmlString baseURL:nil]; 

Puis, après qu'il se termine le chargement:

- (void) webViewDidFinishLoad:(UIWebView *)sender { 
    [self performSelector:@selector(calculateWebViewSize) withObject:nil afterDelay:0.1]; 
} 

- (void) calculateWebViewSize { 

    [weekDetailController.movie_detail sizeToFit]; 
    float newHeight = [[weekDetailController.movie_detail stringByEvaluatingJavaScriptFromString :@"document.getElementById(\"content\").offsetHeight"] floatValue]; 


    newHeight += 300; //height of the other elements 
    NSLog(@"Height: %f",newHeight); 

    CGRect frame = weekDetailController.movie_detail.frame; 

    NSLog(@"Height was: %f",frame.size.height); 

    frame.size.height = newHeight; 

    weekDetailController.movie_detail.frame = frame; 

    [scrollView.scrollView setContentOffset:CGPointZero]; 
    [scrollView.scrollView setContentSize:CGSizeMake(frame.size.width, frame.size.height)]; 
} 

Cela fonctionne très bien la première lorsque la vue est chargée, mais sur les vues suivantes, lorsque le contenu différent a été chargé dans UIWebView (en utilisant le même appel que ci-dessus), l'appel JavaScript pour obtenir la hauteur renvoie des valeurs de plus en plus grandes, même si le contenu est plus petit. il renvoie toujours la hauteur de la plus grande quantité de contenu avait été dans la vue à un moment donné. J'ai essayé de charger une chaîne HTML vide dans la vue pour la "nettoyer", mais cela ne semble pas aider non plus.

Des indices seraient appréciés!

+1

Uhmm ... Vous ne réinitialisez pas newHeight dans le code ci-dessus, en ajoutant simplement 300 sur chaque appel ... – Altealice

+0

whoops - est allé par-dessus bord lors de la suppression du code commenté et a supprimé une ligne (non commentée) qui définit newHeight - le message original a été modifié –

Répondre

0
[scrollView.scrollView setContentOffset:pt]; 
[scrollView.scrollView setContentSize:CGSizeMake(frame.size.width, frame.size.height)]; 

Utilisez-vous des UIScrollViews imbriquées? Il se peut que vous définissiez uniquement la taille de la vue de défilement interne et que la vue de défilement externe soit la plus grande que son contenu ait été.

Edit:

Aussi, vous devez simplement utiliser [scrollView.scrollView setContentOffset:CGPointZero];

+0

Correction de l'élément CGPointZero - merci pour le conseil. Non, ce n'est pas une UIScrollView imbriquée - juste une UIWebView à l'intérieur. Le code que vous avez collé était juste une copie de ce que j'avais ci-dessus, donc malheureusement, rien n'a encore été résolu. –

+0

Ouais, j'ai fait une copie, je voulais préciser à quelle partie de votre code je faisais référence. Pourtant, je me demande pourquoi vous avez utilisé 'scrollView.scrollView' ... Quoi qu'il en soit, UIWebView est une sous-classe UIScrollView, vous devriez donc toujours définir la taille de contenu de la vue de défilement externe. Est-ce que vous le faites? – Altealice

+1

Pour autant que je sache, UIWebView n'est pas une sous-classe UIScrollView - elle descend directement de UIView, bien qu'elle soit conforme au délégué UIScrollView. Il n'a certainement pas d'élément contentSize - juste un attribut frame, que j'ai défini ci-dessus. –

0

Lorsque vous utilisez UIWebViews imbriquées avec contraintes, vous devez réinitialiser la contrainte (par exemple 1) et recharger le WebView après:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, coordinator.transitionDuration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
    self.webViewHeightConstraint.constant = 1; 
    [self reloadWebView]; //[self.webview reload] doesn't work here, simply load with the given url or given html content 
}); 
Questions connexes