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ètre CGSizeZero
: Si vous lisez la documentation officielle d'Apple sur cette méthode et son paramètre, elle dit clairement:
L'implémentation par défaut de cette méthode renvoie la partie de taille du rectangle de limites de la vue. Les sous-classes peuvent remplacer cette méthode pour renvoyer une valeur personnalisée basée sur la disposition souhaitée de toutes les sous-vues. Par exemple, un objet UISwitch renvoie une valeur de taille fixe qui représente la taille standard d'une vue de commutation, et un objet UIImageView renvoie la taille de l'image qu'il affiche actuellement.
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 le webView
cadre du 's avant d'appeler sizeThatFits
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 fichier scrollView
.
Voici mon code pour forcer la mise en page de la webView
à la valeur souhaitée width
et récupérer le height
jeu correspondant à webView
lui - même:
Obj-C
- (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.
}
Swift 4.x
func webViewDidFinishLoad(_ aWebView: UIWebView) {
aWebView.scrollView.isScrollEnabled = false
var frame = aWebView.frame
frame.size.width = 200
frame.size.height = 1
aWebView.frame = frame
frame.size.height = aWebView.scrollView.contentSize.height
aWebView.frame = frame;
}
Notez que dans mon exemple, webView
a été incorporé dans une coutume scrollView
ayant d' autres webViews
... Tous ces webViews
avaient leur webView.scrollView.scrollEnabled = NO
, et le dernier morceau de code que je devais ajouter était le calcul du height
de contentSize
ma coutume scrollView
intégrer ces webViews
, mais il était aussi facile comme la somme ma webView
est frame.size.height
calculée avec l'astuce décrite ci - dessus ...