2010-07-23 4 views
9

J'ai cherché la semaine dernière pour la réponse à cette question.Comment réinitialiser le zoom de UIWebView? J'utilise déjà scalesPagesToFit = YES;

J'ai un UIWebView, à l'intérieur d'un UIScrollView. Tout fonctionne très bien, mais je veux que le contenu de l'UIWebView réinitialise son zoom, lorsque l'orientation change.

Dans le HTML à l'intérieur de l'UIWebView, j'ai défini la largeur de la fenêtre (w/a meta tag) sur "device-width" puis sur le côté Obj-C, j'ai défini scalesPagesToFit = YES;

J'ai essayé de réinitialiser le zoom avec javascript; en remplaçant les balises meta en cours d'exécution; rechargement; accéder à UIScrollView à l'intérieur de l'UIWebView; etc ...

mais sans succès.

L'un de vous les dieux connaît-il une solution de contournement?

Le seul que je peux penser est hors de recréer le UIWebViews chaque fois que nous changeons l'orientation, mais qui les rend clignotent au blanc tout contenu rendu, ce qui a l'air terrible :(

Toute pensée?

un grand merci, André

+0

Peut-être l'astuce consiste à reconstruire les webviews? Je l'ai essayé, mais ils clignotent en blanc, à cause de ce moment où ils perdent leur contenu, donc ça n'a pas l'air génial. D'autres solutions de contournement? – Andre

+0

Tourné dans le noir, mais je pense que la version mobile du site wikipedia le fait. Vous pouvez prendre un pic à son html/javascript. – Douglas

Répondre

8

Je devine juste ici et ne l'ai pas essayé, mais un UIWebView a AFAIK un enfant UIScrollView donc, on devrait pouvoir le faire.

for (UIScrollView *scroll in [myWebView subviews]) { 
    // Make sure it really is a scroll view and reset the zoom scale. 
    if ([scroll respondsToSelector:@selector(setZoomScale:)]) 
     [scroll setZoomScale:1.0]; 
} 
+0

Savez-vous si cela va passer l'approbation de l'App Store, ou est-ce une API privée? Cheers, Andre – Andre

+1

Cela devrait être parfaitement bien. J'ai vu un article qui utilise la même technique pour désactiver le rebond de la vue quand il atteint la fin. Seules les API publiques sont utilisées ici, donc rien à quoi Apple ne peut se plaindre. Si Apple décide de changer UIWebView pour ne plus utiliser d'enfant UIScrollView, ce code ne tombera pas en panne, il ne réinitialisera plus le zoom. – DarkDust

+1

Cool. Juste pour que tu saches, j'avais déjà essayé ce code et ça n'a pas marché. J'ai trouvé que pour le faire fonctionner (dans mon cas) vous devez d'abord remplacer les balises META dans le HTML, pour changer la taille maximale de la fenêtre d'affichage à 1.0, puis appeler le setZoomScale. – Andre

1

Si vous voulez faire programmatiquement c'est la seule façon que je pouvais trouver pour l'accomplir: (définir vos propres formats si vous le souhaitez, je tentais de faire un zoom arrière après avoir tapé dans un champ de formulaire)

UIScrollView *sv = [[webViewView subviews] objectAtIndex:0]; 
[sv zoomToRect:CGRectMake(0, 0, sv.contentSize.width, sv.contentSize.height) animated:YES]; 
1

Mise à jour: downscaling ne fonctionnait pas correctement lors de l'utilisation

[[[webView subviews] lastObject] setZoomScale:0.25]; 

la qualité des images étant sur la page à échelle réduite était horrible. Faire:

[[[webView subviews] lastObject] setZoomScale:0.25 animated:YES]; 

L'a corrigé. Donc, cette dernière ligne est celle que vous pourriez utiliser. WebView a été sous-classé d'un UIWebView qui se trouve sur un fichier IB.

Je n'ai pas utilisé la Viewport du tout. Je trouve que l'on devrait choisir soit de le faire du côté Cocoa Touch ou utiliser JS.

J'utilisé:

webView.scalesPageToFit = YES; 

Je me demande s'il y a un moyen de remise à zéro du scalesPageToFit.

3

Sur iOS 5+, vous avez accès à scrollView. Faites simplement:

[webView.scrollView setZoomScale: 1.0];

+0

cela fonctionne bien, merci. c'est beaucoup plus simple que la boucle for. mais comme @Andre a dit dans un commentaire sur la réponse acceptée, vous devez d'abord remplacer les balises META dans le HTML pour changer la taille maximale de la fenêtre d'affichage à 1.0 –

0

Adaptation de la réponse de Captnwalker1, je suis venu avec ceci:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    if(toInterfaceOrientation ==UIInterfaceOrientationPortrait||toInterfaceOrientation==UIInterfaceOrientationMaskPortraitUpsideDown) 
    { 
     currentScrollView = [[webView subviews] objectAtIndex:0]; 
     [currentScrollView zoomToRect:CGRectMake(0, 0, currentScrollView.contentSize.width, currentScrollView.contentSize.height) animated:NO]; 
    } 
    else 
    { 
     currentScrollView = [[webView subviews] objectAtIndex:0]; 
     [currentScrollView zoomToRect:CGRectMake(0, 0, currentScrollView.contentSize.width, currentScrollView.contentSize.height) animated:NO]; 
    } 
} 

donc votre image charger WebView, et l'image réinitialiser sa taille lors de la rotation.

Questions connexes