Как изменить размер WebView в соответствии с его содержимым?

Я хочу установить простое содержимое html в веб-представление, а затем изменить его размер в соответствии с его содержимым.

Чтобы установить простое содержимое html в веб-представлении, я использовал этот код, и он работает нормально:

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

Прямо сейчас, если контент больше его фактического размера, он отображается в виде веб-страницы, отображая в нем как вертикальный, так и горизонтальный скроллер. Я хочу установить некоторую ширину по умолчанию и управлять высотой в соответствии с ее содержимым таким образом, чтобы ни горизонтальный, ни вертикальный скроллер не отображались.

Может кто-нибудь предложить мне какое-то решение?

Спасибо,

Miraaj

Ответ 1

Вы можете зарегистрироваться в качестве делегата загрузки фрейма WebView, а при загрузке страницы вы можете запросить представление документа основного кадра для его размера и изменить размер WebView. Убедитесь, что вы отключили полосы прокрутки на кадре или у вас возникнут проблемы.

Имейте в виду, что некоторые страницы могут быть очень большими, когда я тестировал daringfireball.net, он пришел на высоту 17612 пунктов, что явно слишком велико для отображения на экране.

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

Ответ 2

Другой альтернативой является запрос DOM для высоты вашего контента.

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

Ключевым моментом здесь является размещение вашего содержимого внутри именованного элемента, чтобы можно было использовать getElementById. В моей реализации использовался простой элемент <div id="foo">.

В моем конкретном случае мой WebView находился внутри NSSplitView, поэтому первый сброс высоты WebView на что-то маленькое вызывал мерцание.

У меня есть образец проекта здесь, демонстрирующий его.