Comment faire pour déterminer la taille du contenu d'une UIWebView?
J'ai un UIWebView
différentes (une seule page) contenu. Je voudrais savoir le CGSize
du contenu pour redimensionner mes parent points de vue de façon appropriée. L'évidence -sizeThatFits:
malheureusement retourne la taille d'image de la webView.
- Je ne suis pas sûr, mais peut-être les réponses à cette question pour vous aider: stackoverflow.com/questions/745160/...
Vous devez vous connecter pour publier un commentaire.
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 de-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 le
-webViewDidFinishLoad:
méthode du délégué.Obj-C
Swift 4.x
Je me dois de souligner il y a 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.
UIWebView
est plus élevé que votre vue parent, vous devez l'intégrer dans unUIScrollView
.aWebView.frame = frame;
ligne.J'ai une autre solution qui fonctionne très bien.
D'une part, Ortwin approche de l' & 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ètreCGSizeZero
: Si vous lisez Apple documentation Officielle à propos de ces méthodes et de son paramètre, il est dit clairement :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é à
[webView sizeThatFits: ...]
devrait au moins avoir souhaitéwidth
. Avec sa solution, la largeur souhaitée est définie à l'webView
s'image avant d'appelersizeThatFits
avec unCGSizeZero
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 incorporé dans unscrollView
.Voici mon code pour forcer la Mise en page de la
webView
souhaitéwidth
et d'obtenir le correspondantheight
àwebView
lui-même:Obj-C
Swift 4.x
Noter que dans mon exemple, le
webView
a été incorporé dans un personnaliséscrollView
avoir d'autreswebViews
... Tous ceswebViews
avaient leurwebView.scrollView.scrollEnabled = NO
, et le dernier morceau de code que j'ai dû ajouter le calcul de laheight
de lacontentSize
de ma coutumescrollView
incorporation de ceswebViews
, mais c'était aussi facile que de sommation monwebView
'sframe.size.height
calculée avec l'astuce décrite ci-dessus...-[UIWebView scrollView]
est disponible dans iOS 5.0 ou version ultérieure uniquement.Ressusciter cette question parce que j'ai trouvé Ortwin la réponse de seulement travailler la PLUPART du temps...
La
webViewDidFinishLoad
méthode peut être appelée plus d'une fois, et la première valeur retournée parsizeThatFits
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
quandwebViewDidFinishLoad
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é quesizeToFit
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:
Swift (2.2):
Mise à jour: j'ai trouvé comme mentionné dans les commentaires, cela ne semble pas attraper le cas où le contenu a rétréci. Vous ne savez pas si c'est vrai pour l'ensemble du contenu et de la version d'OS, lui donner un essai.
webView.scalesPageToFit = YES
comme @Sijo mentionné dans le commentaire ci-dessus.webview.scalesPageToFit = NO;
bien sûr, c'est peut-être impossible d'avoir une taille de trame de hauteur de 1pt, mais il m'arrive d'être en utilisant une UIWebView de rendre et de mettre en cache le contenu de l'image à l'écran. Donc cette solution est génial!Dans Xcode 8 et iOS 10 pour déterminer la hauteur d'un affichage web. vous pouvez obtenir la hauteur à l'aide de
OU pour Swift
Une solution simple serait d'utiliser
webView.scrollView.contentSize
mais je ne sais pas si cela fonctionne avec JavaScript. Si il n'y a pas de JavaScript utilisé cela fonctionne pour vous:Autant que je sache, vous pouvez utiliser
[webView sizeThatFits:CGSizeZero]
à la figure, c'est la taille du contenu.C'est bizarre!
J'ai testé les deux solutions de
sizeThatFits:
et[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"]
sont PAS de travail pour moi.Cependant, j'ai trouvé un intéressant moyen facile d'obtenir la bonne hauteur de contenu de pages web. Actuellement, je l'ai utilisé dans ma méthode du délégué
scrollViewDidScroll:
.Vérifié dans iOS 9.3 Simulateur/de l'Appareil, bonne chance!
EDIT:
De fond: Le contenu html est calculé par mes variable de chaîne et de l'adresse HTTP du contenu du modèle, chargé par la méthode
loadHTMLString:baseURL:
, sans être inscrit scripts JS là.Pour iOS10, je commençais à 0 (zéro) de la valeur de
document.height
doncdocument.body.scrollHeight
est la solution pour obtenir la hauteur de document dans la Webview. Le problème peut être résolu aussi pourwidth
.Je suis en utilisant un
UIWebView
qui n'est pas une sous-vue (et donc ne fait pas partie de la fenêtre de hiérarchie) pour déterminer les tailles de contenus HTML pourUITableViewCells
. J'ai trouvé que l'déconnectéUIWebView
n'a pas de rapport sa taille correctement avec-[UIWebView sizeThatFits:]
. En outre, comme mentionné dans https://stackoverflow.com/a/3937599/9636, vous devez définir laUIWebView
'sframe
height
à 1 afin d'obtenir la bonne hauteur à tous.Si le
UIWebView
hauteur est trop grande (c'est à dire vous l'avez configuré pour 1000, mais le contenu HTML de la taille est à seulement 500):Tous le retour d'un
height
de 1000.Pour résoudre mon problème, dans ce cas, j'ai utilisé https://stackoverflow.com/a/11770883/9636, dont j'ai consciencieusement votées. Cependant, je n'utilise que cette solution lors de mon
UIWebView.frame.width
est le même que le-[UIWebView sizeThatFits:]
width
.Aucun des suggestions ici m'a aidé avec ma situation, mais j'ai lu quelque chose qui ne me donner une réponse. J'ai un ViewController avec un ensemble fixe de contrôles d'INTERFACE utilisateur suivie par une UIWebView. Je voulais que l'ensemble de la page pour faire défiler comme si les contrôles de l'INTERFACE utilisateur ont été connectés au contenu HTML, j'ai donc désactiver le défilement sur la UIWebView et doit ensuite définir la taille du contenu d'un parent de défilement s'afficher correctement.
Le conseil s'est avéré être que UIWebView n'a pas de rapport sa taille correctement jusqu'à ce que le rendu à l'écran. Donc, lorsque je charge le contenu j'ai défini la taille du contenu à la hauteur de l'écran. Puis, dans viewDidAppear-je mettre à jour le scrollview de la taille du contenu à la valeur correcte. Cela a fonctionné pour moi parce que je fais appel loadHTMLString sur le contenu local. Si vous utilisez loadRequest vous devez mettre à jour les contentSize dans webViewDidFinishLoad également, en fonction de la façon dont rapidement le code html est extrait.
Il n'y a pas de scintillement, parce que seule la partie invisible du défilement de l'affichage est modifié.
webViewDidFinishLoad
que l'approche sécuritaire.Si votre code HTML contient lourd HTML contenu comme de l'iframe (c'est à dire facebook-, twitter, instagram-intègre), la véritable solution est beaucoup plus difficile, d'abord l'enveloppe de votre code HTML:
Puis ajouter le traitement x-mise à jour-webview-hauteur-schéma dans votre shouldStartLoadWithRequest:
Et enfin ajoutez le code suivant à l'intérieur de votre layoutSubviews:
P. S. Vous pouvez mettre en œuvre des temps de retarder (SetTimeout et setInterval) à l'intérieur de votre ObjectiveC/Swift-code - c'est à vous.
P. S. S. des informations Importantes sur UIWebView et Facebook Intègre: Intégré Facebook post n'affiche correctement dans UIWebView
Lors de l'utilisation de webview comme une sous-vue quelque part dans le scrollview, vous pouvez définir la hauteur de contrainte pour certains, la valeur de la constante et, plus tard, faire prise par elle et l'utiliser comme:
Je suis aussi coincé sur ce problème, puis j'ai réalisé que si je veux calculer la dynamique de la hauteur de la webView, j'ai besoin de dire la largeur de la webView première, j'ai donc ajouter une ligne avant de js et il s'avère que je peux obtenir de très précis de la hauteur réelle.
Le code est simple comme ceci:
Xcode8 swift3.1:
webViewDidFinishLoad
Délégué:let height = webView.scrollView.contentSize.height
Sans step1, si webview.hauteur > les contentHeight, l'étape 2 sera de retour webview.la hauteur, mais pas contentsize.hauteur de.
Également dans iOS 7 pour un bon fonctionnement de l'ensemble des méthodes d'ajouter ceci dans votre vue-contrôleur
viewDidLoad
méthode:Sinon ni de méthodes de travail comme il le devrait.