2010-04-20 4 views
11

웹보기에서 간단한 html 콘텐츠를 설정 한 다음 콘텐츠에 따라 크기를 조정하려고합니다. 내용에 따라 WebView의 크기를 조정하는 방법은 무엇입니까?

내가이 코드를 사용하는 웹보기 내에서 간단한 HTML 내용을 설정하고 그것을 잘 작동 :

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

을 지금, 내용이 실제 크기보다 더 후 보여주는 웹 뷰에 표시되는 경우 수직 및 수평 스크롤러. 일부 기본 너비를 설정하고 가로 및 세로 스크롤러가 나타나지 않도록 내용에 따라 높이를 관리하려고합니다.

누구든지 나를위한 해결책을 제안 할 수 있습니까?

감사합니다,

Miraaj

답변

20

당신은 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)); 
    } 
} 
+0

고맙습니다 롭 ... 나는 그것을 구현하고 잘하고 있습니다 ..하지만 한가지 문제가 있습니다 : 그것은 항상 다른 내용을 얻고있는 webview의 가장 높은 높이를 설정하고 있습니다. ie. 높이가 1029.0이고 이제는 339.0이어야합니다. 그러면 끝 부분에 공간을 추가하고 높이가 1029.0 인 웹보기를 표시합니다. – Miraaj

+3

문제를 해결했습니다. 내용을 설정하기 전에 웹보기의 크기를 기본값 및 더 작은 값으로 조정하고 있습니다. .. say, (15.0, 0.0, 560.0, 10.0) .. 나는 Rob Rocks라고해야만한다. – Miraaj

+0

보이는 영역의 크기를 변경하는 WebView에서 일부 상호 작용 중에 DOM을 변경하면이 메서드는 'webView : didFinishLoadForFrame'을 다시 호출하지 않습니다. 이 경우에 호출 될 대의원이 있습니까? BTW : 당신의 솔루션은 나를 위해 작동하지 않았다. 어쩌면 당신은 [여기] (http://stackoverflow.com/q/21992854/1146700) 도와 드릴까요? – beipawel

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의 높이를 작은 것으로 재설정하면 깜박임이 발생했습니다.

예제 프로젝트 here을 시연했습니다.

+1

이것은 항상 적절한 값을 반환하기 때문에'[[[webFrame frameView] documentView] frame]'보다 나에게 유리합니다. 이유는 모르지만'documentView.frame'은 페이지가 처음으로로드 될 때만 작동합니다. 그렇지 않으면 빈 크기 (캐싱의 원인 일 수도 있음)가 반환됩니다. – Darrarski

+0

실제로, @Darrarski - 프레임의 크기가 변경된 후에도 작동합니다. 즉, 너비가 변경되어 콘텐츠 높이가 변경되는 반면, 허용 된 답변은 초기 크기를 계속보고 할 때 도움이되지 않습니다. –

관련 문제