2010-04-20 21 views
11

Ich möchte einfache HTML-Inhalte in einer Webansicht festlegen und dann die Größe entsprechend ihrem Inhalt ändern.Wie ändert man die Größe von WebView entsprechend seinem Inhalt?

Um I einfache HTML-Inhalte in Web-Ansicht verwenden Sie diesen Code verwendet, und es funktioniert gut:

[[myWebView mainFrame] loadHTMLString:webViewContents baseURL:baseURLFramed]; 

Gerade jetzt, wenn der Inhalt mehr als seine tatsächliche Größe ist dann in Web-Ansicht erscheint sowohl vertikal zeigt und horizontaler Scroller drin. Ich möchte eine Standardbreite festlegen und die Höhe entsprechend ihrem Inhalt so verwalten, dass weder der horizontale noch der vertikale Bildlauf erscheint.

Kann mir jemand eine Lösung vorschlagen?

Danke,

Miraaj

Antwort

20

Sie können als die WebView ‚s Rahmen Last Delegat registrieren, und wenn die Seite geladen wird können Sie den Hauptrahmen des Dokumentenansicht für seine Größe stellen und die WebView ändern. Stellen Sie sicher, dass Sie die Bildlaufleisten im Rahmen deaktivieren, sonst treten Probleme auf.

Beachten Sie, dass bestimmte Seiten sehr groß sein können, als ich daringfireball.net getestet habe, kam es bei 17612 Punkten hoch, was offensichtlich zu groß ist, um auf dem Bildschirm angezeigt zu werden.

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    //set ourselves as the frame load delegate so we know when the window loads 
    [webView setFrameLoadDelegate:self]; 

    //turn off scrollbars in the frame 
    [[[webView mainFrame] frameView] setAllowsScrolling:NO]; 

    //load the page 
    NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://daringfireball.net"]]; 
    [[webView mainFrame] loadRequest:request]; 
} 

//called when the frame finishes loading 
- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)webFrame 
{ 
    if([webFrame isEqual:[webView mainFrame]]) 
    { 
     //get the rect for the rendered frame 
     NSRect webFrameRect = [[[webFrame frameView] documentView] frame]; 
     //get the rect of the current webview 
     NSRect webViewRect = [webView frame]; 

     //calculate the new frame 
     NSRect newWebViewRect = NSMakeRect(webViewRect.origin.x, 
              webViewRect.origin.y - (NSHeight(webFrameRect) - NSHeight(webViewRect)), 
              NSWidth(webViewRect), 
              NSHeight(webFrameRect)); 
     //set the frame 
     [webView setFrame:newWebViewRect]; 

     //NSLog(@"The dimensions of the page are: %@",NSStringFromRect(webFrameRect)); 
    } 
} 
+0

Thanx Rob ... Ich habe es implementiert und es funktioniert gut .. aber es gibt ein Problem: Es setzt immer die höchste Höhe für das Webview, das ich für verschiedene Inhalte bekomme. wenn höhe 1029.0 war und jetzt sollte es 339.0 dann wird es platz am ende anhängen und zeigt web-ansicht mit höhe 1029.0 – Miraaj

+3

Rob das problem ist jetzt gelöst .. bevor ich den inhalt ändere ich bin jetzt skalieren web-ansicht auf einige standard und kleinere werte. .. sag, (15.0, 0.0, 560.0, 10.0) .. Ich muss Rob Rocks sagen! – Miraaj

+0

Wenn ich das DOM während einer Interaktion im WebView ändere, die eine Änderung auslöst, werden die Dimensionen des sichtbaren Bereichs der Methode 'webView: didFinishLoadForFrame' nicht erneut aufgerufen, oder? Gibt es einen Delegierten, der in diesem Fall angerufen wird? BTW: Deine Lösung hat bei mir nicht funktioniert. Vielleicht kannst du [hier] (http://stackoverflow.com/q/21992854/1146700) helfen? – beipawel

2

Eine andere Alternative ist, das DOM nach der Höhe Ihres Inhalts zu fragen.

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame 
{ 
    NSString* heightOutput = [sender stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").scrollHeight;"]; 
    NSInteger height   = [heightOutput integerValue]; 

    [[self splitView] setPosition:height + 10 ofDividerAtIndex:0]; 
} 

Der entscheidende Punkt hier ist Ihre Inhalte innerhalb eines benannten Elements zu platzieren, so getElementById verwendet werden kann. Meine Implementierung verwendete ein einfaches <div id="foo"> Element.

In meinem speziellen Fall befand sich mein WebView in einem NSSsplitView, daher verursachte zuerst das Zurücksetzen der Höhe des WebView auf etwas Kleines ein Flimmern.

Ich habe ein Beispielprojekt here demonstriert es.

+1

Das funktioniert besser für mich als '[[[[webFrame frameView] documentView] frame]' weil es immer den richtigen Wert zurückgibt. Ich weiß nicht warum, aber 'documentView.frame' funktioniert nur, wenn eine Seite zum ersten Mal geladen wird, ansonsten gibt es eine leere Größe zurück (vielleicht wegen Caching). – Darrarski

+0

In der Tat, @Darrarski - das funktioniert sogar nach der Größe des Rahmens geändert Gor geändert, d. H. Seine Breite geändert, wodurch die Höhe des Inhalts als auch ändern, während die angenommene Antwort in diesem Fall nicht hilft, da es die anfängliche Größe meldet. –

Verwandte Themen