J'ai un UIWebView
contenu différent (d'une seule page). J'aimerais connaître CGSize
le contenu pour redimensionner correctement les vues de mes parents. L'évident -sizeThatFits:
renvoie malheureusement simplement la taille actuelle du cadre de la webView.
116
Réponses:
Il s'est avéré que ma première estimation
-sizeThatFits:
n'était pas complètement fausse. Cela semble fonctionner, mais seulement si le cadre de la webView est défini sur une taille minimale avant l'envoi-sizeThatFits:
. Après cela, nous pouvons corriger la mauvaise taille de cadre par la taille appropriée. Cela semble terrible mais ce n'est en fait pas si mal. Étant donné que nous effectuons les deux changements d'image l'un après l'autre, la vue n'est pas mise à jour et ne scintille pas.Bien sûr, nous devons attendre que le contenu soit chargé, nous mettons donc le code dans la
-webViewDidFinishLoad:
méthode déléguée.Obj-C
Swift 4.x
Je dois souligner qu'il existe une autre approche (merci @GregInYEG) utilisant JavaScript. Je ne sais pas quelle solution fonctionne le mieux.
De deux solutions hacky, j'aime mieux celle-ci.
la source
UIWebView
est supérieur à votre vue parent, vous devez l'intégrer dans un fichierUIScrollView
.J'ai une autre solution qui fonctionne très bien.
D'une part, l'approche et la solution d'Ortwin ne fonctionnent qu'avec iOS 6.0 et versions ultérieures, mais ne fonctionnent pas 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 que je ne comprends pas. avec l'approche d'Ortwin, c'est l'utilisation de la méthode
[webView sizeThatFits:CGSizeZero]
avec le paramètreCGSizeZero
: Si vous lisez la documentation officielle d'Apple sur cette méthode et son paramètre, elle dit clairement:Ce que je veux dire, c'est que c'est comme s'il était tombé sur sa solution sans aucune logique, car à la lecture de la documentation, le paramètre passé à
[webView sizeThatFits: ...]
devrait au moins avoir celui souhaitéwidth
. Avec sa solution, la largeur souhaitée est définie sur lewebView
cadre du 's avant d'appelersizeThatFits
avec unCGSizeZero
paramètre. Je maintiens donc que 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'un webView (Avec sa propriété
webView.scrollView.scrollEnabled = NO
est embarquée dans un fichierscrollView
.Voici mon code pour forcer la mise en page de la
webView
à la valeur souhaitéewidth
et récupérer leheight
jeu correspondant àwebView
lui - même:Obj-C
Swift 4.x
Notez que dans mon exemple,
webView
a été incorporé dans une coutumescrollView
ayant d' autreswebViews
... Tous ceswebViews
avaient leurwebView.scrollView.scrollEnabled = NO
, et le dernier morceau de code que je devais ajouter était le calcul duheight
decontentSize
ma coutumescrollView
intégrer ceswebViews
, mais il était aussi facile comme la somme mawebView
estframe.size.height
calculée avec l'astuce décrite ci - dessus ...la source
-[UIWebView scrollView]
est disponible dans iOS 5.0 ou version ultérieure uniquement.Ressusciter cette question parce que j'ai trouvé que la réponse d'Ortwin ne fonctionnait que la plupart du temps ...
La
webViewDidFinishLoad
méthode peut être appelée plus d'une fois et la première valeur renvoyée parsizeThatFits
n'est qu'une partie de la taille finale. Alors, quelle qu'en soit la raison, le prochain appel àsizeThatFits
quand sewebViewDidFinishLoad
déclenche à nouveau retournera incorrectement la même valeur qu'auparavant! Cela se produira au hasard pour le même contenu que s'il s'agissait d'une sorte de problème de concurrence. Peut-être que ce comportement a changé au fil du temps, car je construis pour iOS 5 et j'ai également constaté quesizeToFit
fonctionne à peu près de la même manière (bien que précédemment ce ne soit pas le cas?)J'ai opté pour cette solution simple:
Rapide (2,2):
Mise à jour: j'ai trouvé comme mentionné dans les commentaires que cela ne semble pas saisir le cas où le contenu a diminué. Je ne sais pas si c'est vrai pour tout le contenu et la version du système d'exploitation, essayez-le.
la source
webView.scalesPageToFit = YES
comme @Sijo mentionné dans le commentaire ci-dessus.Dans Xcode 8 et iOS 10 pour déterminer la hauteur d'une vue Web. vous pouvez obtenir de la hauteur en utilisant
OU pour Swift
la source
Une solution simple serait de simplement utiliser
webView.scrollView.contentSize
mais je ne sais pas si cela fonctionne avec JavaScript. S'il n'y a pas de JavaScript utilisé, cela fonctionne à coup sûr:la source
AFAIK, vous pouvez utiliser
[webView sizeThatFits:CGSizeZero]
pour déterminer la taille de son contenu.la source
C'est bizarre!
Je l' ai testé les solutions à la fois
sizeThatFits:
et[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"]
sont pas travailler pour moi.Cependant, j'ai trouvé un moyen simple et intéressant d'obtenir la bonne hauteur de contenu de la page Web. Actuellement, je l'ai utilisé dans ma méthode déléguée
scrollViewDidScroll:
.Vérifié dans le simulateur / appareil iOS 9.3, bonne chance!
ÉDITER:
Contexte: Le contenu html est calculé par ma variable de chaîne et mon modèle de contenu HTTP, chargé par méthode
loadHTMLString:baseURL:
, aucun script JS enregistré.la source
Pour iOS10, je recevais 0 (zéro) valeur
document.height
doncdocument.body.scrollHeight
est la solution pour obtenir la hauteur du document Webview. Le problème peut être résolu également pourwidth
.la source
J'utilise un
UIWebView
qui n'est pas une sous-vue (et ne fait donc pas partie de la hiérarchie des fenêtres) pour déterminer les tailles du contenu HTML pourUITableViewCells
. J'ai trouvé que le déconnectéUIWebView
ne signale pas correctement sa taille avec-[UIWebView sizeThatFits:]
. De plus, comme mentionné dans https://stackoverflow.com/a/3937599/9636 , vous devez définir leUIWebView
'sframe
height
sur 1 afin d'obtenir la bonne hauteur.Si la
UIWebView
hauteur du s est trop grande (c'est-à-dire que vous l'avez définie sur 1000, mais la taille du contenu HTML n'est que de 500):Tous renvoient un
height
de 1000.Pour résoudre mon problème dans ce cas, j'ai utilisé https://stackoverflow.com/a/11770883/9636 , que j'ai consciencieusement voté. Cependant, je n'utilise cette solution que lorsque mon
UIWebView.frame.width
est le même que le-[UIWebView sizeThatFits:]
width
.la source
Aucune des suggestions ici ne m'a aidé avec ma situation, mais j'ai lu quelque chose qui m'a donné une réponse. J'ai un ViewController avec un ensemble fixe de contrôles d'interface utilisateur suivi d'un UIWebView. Je voulais que la page entière défile comme si les contrôles de l'interface utilisateur étaient connectés au contenu HTML.Je désactive donc le défilement sur UIWebView et je dois ensuite définir correctement la taille du contenu d'une vue de défilement parent.
Le conseil important s'est avéré être que UIWebView ne signale pas sa taille correctement jusqu'à ce qu'il soit rendu à l'écran. Ainsi, lorsque je charge le contenu, je règle la taille du contenu sur la hauteur d'écran disponible. Ensuite, dans viewDidAppear, je mets à jour la taille du contenu du scrollview à la valeur correcte. Cela a fonctionné pour moi car j'appelle loadHTMLString sur le contenu local. Si vous utilisez loadRequest, vous devrez peut-être également mettre à jour contentSize dans webViewDidFinishLoad, en fonction de la rapidité avec laquelle le code HTML est récupéré.
Il n'y a pas de scintillement, car seule la partie invisible de la vue de défilement est modifiée.
la source
webViewDidFinishLoad
l'approche sûre.Si votre HTML contient des contenus HTML lourds comme ceux d'iframe (c'est-à-dire facebook, twitter, instagram-embeds), la vraie solution est beaucoup plus difficile, enveloppez d'abord votre HTML:
Ensuite, ajoutez la gestion de x-update-webview-height -scheme dans votre shouldStartLoadWithRequest :
Et enfin, ajoutez le code suivant dans votre layoutSubviews :
PS Vous pouvez implémenter la temporisation (SetTimeout et setInterval) dans votre ObjectiveC / code Swift - c'est à vous de décider.
PSS Informations importantes sur UIWebView et Facebook Embeds: la publication Facebook intégrée ne s'affiche pas correctement dans UIWebView
la source
Lorsque vous utilisez la vue Web comme sous-vue quelque part dans la vue de défilement, vous pouvez définir la contrainte de hauteur sur une valeur constante, puis en faire une sortie et l'utiliser comme:
la source
Je suis également coincé sur ce problème, puis j'ai réalisé que si je veux calculer la hauteur dynamique de la webView, je dois d'abord indiquer la largeur de la webView, donc j'ajoute une ligne avant js et il s'avère que je peux obtenir hauteur réelle très précise.
Le code est simple comme ceci:
la source
Xcode8 swift3.1:
webViewDidFinishLoad
délégué:let height = webView.scrollView.contentSize.height
Sans step1, si webview.height> actual contentHeight, l'étape 2 renverra webview.height mais pas contentsize.height.
la source
Également dans iOS 7 pour le bon fonctionnement de toutes les méthodes mentionnées, ajoutez ceci dans votre
viewDidLoad
méthode de contrôleur de vue :Sinon, aucune des méthodes ne fonctionnerait comme elle le devrait.
la source