web-dev-qa-db-fra.com

iPhone - Le redimensionnement automatique du contenu UIWebView ne correspond pas au cadre

Je génère un UIWebView dans ma méthode viewDidLoad, avec une taille minuscule (disons quelque chose comme 50x70). Et puis je le mets dans un super UIView. 

J'aimerais que son contenu corresponde au cadre webView. Pour ce faire, j'ai écrit:

        oneView = [[UIWebView alloc] initWithFrame:CGRectMake(x, y, W, H)];
        oneView.backgroundColor = [UIColor whiteColor];
        oneView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        oneView.scalesPageToFit = YES;
        oneView.autoresizesSubviews = YES;

        [self.view addSubview:oneView];
        [oneView loadRequest:/*some request*/];

Mais pour ce faire, la page Web n'est pas redimensionnée par rapport au cadre de UIWebView . Elle semble être redimensionnée à autre chose, plus petite que celle de la vue supérieure et plus large que celle de la vue Web.

enter image description here

Si je règle la taille du cadre de la webview à la taille de la vue d'ensemble, ça va.
Comment puis-je forcer le contenu Web (contenu réel de www) à s’ajuster au cadre de la UIWebView "réduite"?

27
Oliver

La réponse est: vous le faites déjà mais il y a des limites. 

Regardez les captures d'écran suivantes:

Screeshot 1, scalePageToFit OUI et NON

Les deux webview ont la même largeur. Dans la partie inférieure, la page s’adapte parfaitement.

enter image description here

Screeshot 2, scalePageToFit les deux OUI, mais de plus petites largeurs définies

Les deux visionneuses Web tentent de s’ajuster à la page, mais ce n’est pas le cas, car la taille est limitée.

enter image description here

44
Nick Weaver

Essayez ceci. Cela fonctionne pour moi.

NSString *strTemplateHTML = [NSString stringWithFormat:@"<html><head><style>img{max-width:100%%;height:auto !important;width:auto !important;};</style></head><body style='margin:0; padding:0;'>%@</body></html>", @"insert your html content here"];

[webView loadHTMLString:strTemplateHTML baseURL:nil];
2
Rajni Johar Raswant

Pour ceux qui ont rencontré le même problème, vous pouvez désactiver le défilement natif UIWebView en 

self.webView.scrollView.scrollEnabled = NO;

et ajoutez une scrollView distincte qui gérera le défilement et le zoom au lieu du défilement natif de webView . Suivant 

- (void) webViewDidFinishLoad:(UIWebView *)webView
{
   CGRect frame = _webView.frame;
   CGSize fittingSize = [_webView sizeThatFits:_webView.scrollView.contentSize];
   frame.size = fittingSize;
   _webView.frame = frame;
   self.scrollView.contentSize = self.webView.scrollView.contentSize;
}

pour définir webView frame .. Espérons que cela aide quelqu'un. Bon codage!

2
zshcbka

Vous pouvez faire ce qui suit:

oneview.contentMode = UIViewContentModeScaleAspectFit;

Cela fera croître le contenu de votre vue à mesure que votre vue grandit. Le contenu deviendra aussi volumineux que possible tout en s'intégrant parfaitement dans UIWebView et sans distorsion.

Il existe d'autres options pour cette propriété, et vous trouverez une assez bonne explication des plus compliquées, ainsi que des images illustrant leurs effets, dans le Afficher le guide de programmation pour iOS

Notez que le masque de redimensionnement automatique que vous avez défini fera croître la vue elle-même uniquement lorsque sa vue d'ensemble augmente. Si self.view est déjà important lors de la création de la petite UIWebView et que l'auto.view ne se développe pas, UIWebView ne se développera pas. Vous êtes probablement au courant de cela, mais je l'ajoute au cas où, car nous ne pouvons pas voir le cadre de self.view dans cet extrait de code.

J'espère que c'est utile.

0
salo.dm

Pour Swift 2.2 J'ai réalisé la même chose avec

//Document file url
var docUrl = NSURL(string: "https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjjwPSnoKfNAhXFRo8KHf6ACGYQFggbMAA&url=http%3A%2F%2Fwww.snee.com%2Fxml%2Fxslt%2Fsample.doc&usg=AFQjCNGG4FxPqcT8RXiIRHcLTu0yYDErdQ&sig2=ejeAlBgIZG5B6W-tS1VrQA&bvm=bv.124272578,d.c2I&cad=rja")

let req = NSURLRequest(URL: docUrl!)
webView.delegate = self
//here is the sole part
webView.scalesPageToFit = true
webView.contentMode = .ScaleAspectFit
webView.loadRequest(req)
0
swiftBoy

Pour Swift 3, j'ai réalisé la même chose avec

DispatchQueue.main.async {
                if let finalURL = URL(string: urlString) {
                    let request = URLRequest(url: finalURL)

                    // self.webView.sizeToFit()
                    self.webView.scalesPageToFit = true
                    self.webView.contentMode = .scaleAspectFit
                    self.webView.loadRequest(request)
                }
            }
0
Lion