Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何根据内容调整WebView的大小?_Cocoa_Webview - Fatal编程技术网

Cocoa 如何根据内容调整WebView的大小?

Cocoa 如何根据内容调整WebView的大小?,cocoa,webview,Cocoa,Webview,我想在web视图中设置简单的html内容,然后根据其内容调整其大小 为了在web视图中设置简单的html内容,我使用了以下代码,它工作正常: [[myWebView mainFrame] loadHTMLString:webViewContents baseURL:baseURLFramed]; 现在,若内容超过了它的实际大小,那个么它会出现在web视图中,同时显示垂直和水平滚动条。我想设置一些默认宽度,并根据内容管理高度,这样就不会出现水平或垂直滚动条 有人能给我一些解决办法吗 谢谢 Mir

我想在web视图中设置简单的html内容,然后根据其内容调整其大小

为了在web视图中设置简单的html内容,我使用了以下代码,它工作正常:

[[myWebView mainFrame] loadHTMLString:webViewContents baseURL:baseURLFramed];
现在,若内容超过了它的实际大小,那个么它会出现在web视图中,同时显示垂直和水平滚动条。我想设置一些默认宽度,并根据内容管理高度,这样就不会出现水平或垂直滚动条

有人能给我一些解决办法吗

谢谢


Miraaj

您可以注册为
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));
    }
}

另一种选择是向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。我的实现使用了一个简单的
元素

在我的特殊情况下,我的WebView位于NSSplitView内部,因此首先将WebView的高度重置为较小值会导致闪烁


我有一个示范项目。

Thanx Rob。。。我已经实施了它,它工作得很好。。但有一个问题:它总是为不同内容的webview设置最高高度。。也就是说,如果高度为1029.0,现在应该是339.0,那么它会在末尾添加空间,并显示高度为1029.0的web视图。问题现在解决了。。在设置内容之前,我现在将web视图的大小调整为一些默认值和更小的值。。。比如说,(15.0,0.0560.0,10.0)。。我得说罗伯·罗克斯!当我在WebView中的某个交互过程中更改DOM时,会触发对其可见区域维度的更改,此方法
WebView:didFinishLoadForFrame
不会再次调用,对吗?在这种情况下是否会调用某个委托?顺便说一句:你的解决方案对我不起作用。也许你可以帮忙?这比
[[[webFrame frameView]documentView]frame]
更适合我,因为它总是返回正确的值。我不知道为什么,但是
documentView.frame
只有在第一次加载页面时才起作用,否则它会返回空大小(可能是因为缓存)。事实上,@Darrarski-这甚至在调整了框架的大小后起作用,即它的宽度改变了,导致内容高度也改变了,然而,接受的答案在这种情况下没有帮助,因为它一直报告初始大小。