2010-04-20 5 views
11

Chcę ustawić prostą zawartość html w widoku internetowym, a następnie zmienić jej rozmiar zgodnie z zawartością.Jak zmienić rozmiar WebView zgodnie z zawartością?

Aby ustawić proste zawartość html zasięgu wzroku internetowej Użyłem tego kodu i działa prawidłowo:

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

Teraz, jeśli zawartość jest większa niż jego rzeczywisty rozmiar następnie wydaje się w świetle internetowej pokazując zarówno pionowe i horyzontalny scroller w nim. Chcę ustawić domyślną szerokość i zarządzać wysokością zgodnie z jej zawartością w taki sposób, aby nie pojawiał się ani poziome, ani pionowe przewijanie.

Czy ktoś może zaproponować mi rozwiązanie?

Dzięki,

Miraaj

Odpowiedz

20

można zarejestrować jako WebView „s ramy obciążenia delegata, a po załadowaniu strony można zapytać widok dokumentu ramy głównej za jego wielkość i rozmiar WebView. Upewnij się, że wyłączasz paski przewijania na ramce lub będziesz mieć problemy.

Należy pamiętać, że niektóre strony mogą być bardzo duże, gdy testowałem daringfireball.net, uzyskałem 17612 punktów, co jest oczywiście zbyt duże, aby wyświetlić je na ekranie.

- (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 ... Zaimplementowałam go i działa dobrze ... ale jest jeden problem: zawsze ustawia najwyższą wysokość dla webview, który dostaję dla różnych treści .. ie. jeśli wysokość wyniosła 1029,0, a teraz powinna wynosić 339,0, to dodaje miejsce na końcu i pokazuje widok sieci z wysokością 1029.0 – Miraaj

+3

Spraw, by problem został rozwiązany. Przed ustawieniem jego zawartości zmieniam teraz rozmiar widoku internetowego na pewne domyślne i mniejsze wartości. .. say, (15.0, 0.0, 560.0, 10.0) .. Muszę powiedzieć, Rob Rocks! – Miraaj

+0

Kiedy zmieniam DOM podczas jakiejś interakcji w WebView, która wyzwala zmianę wymiarów widocznego obszaru, to ta metoda 'webView: didFinishLoadForFrame' nie będzie ponownie wywoływana, prawda? Czy jest jakiś delegat, który zostanie wezwany w tej sprawie? BTW: Twoje rozwiązanie nie działa dla mnie. Może możesz pomóc [tutaj] (http://stackoverflow.com/q/21992854/1146700)? – beipawel

2

Inną opcją jest zapytanie DOM o wysokość zawartości.

- (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]; 
} 

Kluczową sprawą jest umieszczenie zawartości wewnątrz nazwanego elementu, aby można było użyć getElementById. Moja implementacja wykorzystała prosty element <div id="foo">.

W moim szczególnym przypadku mój WebView był wewnątrz NSSplitView, więc pierwsze resetowanie wysokości WebView do czegoś małego powodowało migotanie.

Mam przykładowy projekt here demonstrujący go.

+1

Działa to lepiej dla mnie niż "[[[webFrame frameView] documentView] frame]' ponieważ zawsze zwraca odpowiednią wartość. Nie wiem dlaczego, ale "documentView.frame" działa tylko wtedy, gdy strona jest ładowana po raz pierwszy, w przeciwnym razie zwraca pusty rozmiar (być może z powodu buforowania). – Darrarski

+0

Rzeczywiście, @Darrarski - działa nawet po zmianie wielkości ramki, zmianie jej szerokości, co powoduje zmianę wysokości treści, podczas gdy zaakceptowana odpowiedź nie pomaga w tym przypadku, ponieważ raportuje początkowy rozmiar. –