J’ai un UIWebView avec contenu différent (page unique). Je voudrais savoir la CGSize du contenu pour redimensionner mon point de vue de parent correctement. L’évidence `` malheureusement juste retourne la taille du cadre actuel de l’affichage Web.
Réponses
Trop de publicités?Il s'est avéré que ma première estimation à l'aide de -sizeThatFits:
n'était pas complètement faux. Il semble fonctionner, mais seulement si l'image de la webView est réglé à une taille minimale avant l'envoi d' -sizeThatFits:
. Après que nous puissions corriger la mauvaise taille de l'image par la taille. Cela semble terrible, mais c'est effectivement pas mal. Depuis que nous faisons cadre des changements les uns après les autres, le point de vue n'est pas mis à jour et ne clignote pas.
Bien sûr, nous devons attendre jusqu'à ce que le contenu a été chargé, nous avons donc mis le code dans l' -webViewDidFinishLoad:
délégué de la méthode.
- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
CGRect frame = aWebView.frame;
frame.size.height = 1;
aWebView.frame = frame;
CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
aWebView.frame = frame;
NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);
}
Je me dois de souligner qu'il existe une autre approche (merci @GregInYEG) à l'aide de JavaScript. Pas sûr que la solution la plus performante.
De deux hacky solutions je l'aime mieux.
J'ai une autre solution qui fonctionne très bien.
D'une part, Ortwin de l'approche et la solution ne fonctionne qu'avec iOS 6.0 et versions ultérieures, mais ne parvient pas à fonctionner correctement sur iOS 5.0, 5.1 et 5.1.1, et d'autre part il y a quelque chose que je n'aime pas et ne peut pas comprendre avec Ortwin de l'approche, c'est l'utilisation de la méthode [webView sizeThatFits:CGSizeZero]
avec le paramètre CGSizeZero
: Si vous lisez Apple documentation Officielle à propos de ces méthodes et de son paramètre, il est dit clairement :
L'implémentation par défaut de cette méthode retourne la taille de la portion de la vue les limites d'un rectangle. Les sous-classes peuvent remplacer cette méthode pour renvoyer une valeur personnalisée basée sur la mise en page souhaitée de tous les sous-vues. Par exemple, un UISwitch objet renvoie une taille fixe de la valeur que représente la taille standard d'un commutateur de vue, et une UIImageView objet renvoie la taille de l'image en cours d'affichage.
Ce que je veux dire, c'est qu'il est comme il est venu à travers sa solution, sans aucune logique, car la lecture de la documentation, le paramètre passé à l' [webView sizeThatFits: ...]
devrait au moins avoir souhaité width
. Avec sa solution, la largeur souhaitée est définie à l' webView
'image avant d'appeler sizeThatFits
avec un CGSizeZero
paramètre. Donc je maintiens cette solution fonctionne sur iOS 6 par "hasard".
J'ai imaginé une approche plus rationnelle, qui a l'avantage de travailler pour iOS 5.0 et plus tard... Et aussi dans des situations complexes où plus d'une webView (Avec ses biens webView.scrollView.scrollEnabled = NO
est intégré dans un scrollView
.
Voici mon code pour forcer la Mise en page de l' webView
souhaité width
et obtenir le correspondant height
à webView
lui-même:
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
aWebView.scrollView.scrollEnabled = NO; // Property available in iOS 5.0 and later
CGRect frame = aWebView.frame;
frame.size.width = 200; // Your desired width here.
frame.size.height = 1; // Set the height to a small one.
aWebView.frame = frame; // Set webView's Frame, forcing the Layout of its embedded scrollView with current Frame's constraints (Width set above).
frame.size.height = aWebView.scrollView.contentSize.height; // Get the corresponding height from the webView's embedded scrollView.
aWebView.frame = frame; // Set the scrollView contentHeight back to the frame itself.
}
Notez que dans mon exemple, l' webView
a été incorporé dans une coutume scrollView
autres webViews
... Tous ces webViews
ont eu leur webView.scrollView.scrollEnabled = NO
, et le dernier morceau de code que j'ai dû ajouter le calcul de l' height
de la contentSize
de ma coutume scrollView
incorporation de ces webViews
, mais c'était aussi facile que de sommation mon webView
s' frame.size.height
calculée avec l'astuce décrite ci-dessus...
Ressusciter cette question parce que j'ai trouvé Ortwin la réponse de seulement travailler la PLUPART du temps...
Le webViewDidFinishLoad méthode peut être appelée plus d'une fois, et la première valeur retournée par sizeThatFits est seulement une partie de ce que la taille finale ne devrait l'être. Ensuite, pour quelque raison que ce soit le prochain appel à sizeThatFits quand webViewDidFinishLoad déclenche à nouveau, à tort, retourner la même valeur qu'avant! Cela va se produire de façon aléatoire pour le même contenu, comme si c'était une sorte de simultanéité problème. Peut-être que ce comportement a changé au fil du temps, parce que je suis en train de construire pour iOS 5 et avons également constaté que sizeToFit fonctionne de la même manière (bien que déjà ce n'est pas le cas?)
J'ai réglé sur cette solution simple:
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
CGFloat height = [[aWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
CGFloat width = [[aWebView stringByEvaluatingJavaScriptFromString:@"document.width"] floatValue];
CGRect frame = aWebView.frame;
frame.size.height = height;
frame.size.width = width;
aWebView.frame = frame;
}