2010-04-20 43 views
11

Tôi muốn đặt nội dung html đơn giản trong chế độ xem web và sau đó thay đổi kích thước nội dung theo nội dung của nó.Cách đổi kích thước WebView theo nội dung của nó?

Để thiết lập nội dung html đơn giản trong phạm vi xem web tôi đã sử dụng đoạn mã này và nó đang làm việc tốt:

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

Ngay bây giờ, nếu nội dung là hơn kích thước thực tế của nó sau đó nó xuất hiện trong quan điểm của web hiển thị cả dọc và cuộn ngang trong đó. Tôi muốn thiết lập một số chiều rộng mặc định và quản lý chiều cao theo nội dung của nó theo cách sao cho cả cuộn ngang và dọc không xuất hiện.

Có ai có thể đề xuất cho tôi một số giải pháp cho nó không?

Cảm ơn,

Miraaj

Trả lời

20

Bạn có thể đăng ký làm khung đại biểu tải của s WebView, và khi tải trang web mà bạn có thể yêu cầu xem tài liệu khung chính cho kích thước của nó và thay đổi kích thước WebView. Đảm bảo bạn tắt thanh cuộn trên khung hoặc bạn sẽ gặp sự cố.

Hãy lưu ý rằng một số trang nhất định có thể rất lớn, khi tôi kiểm tra daringfireball.net, nó ở mức cao 17612 điểm, hiển nhiên là quá lớn để hiển thị trên màn hình.

- (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 ... Tôi đã triển khai nó và nó hoạt động tốt .. nhưng có một vấn đề: nó luôn đặt chiều cao cao nhất cho webview mà tôi nhận được cho các nội dung khác nhau. nếu chiều cao là 1029.0 và bây giờ nó sẽ là 339.0 sau đó nó là phụ thêm không gian ở cuối và hiển thị xem web với chiều cao 1029.0 – Miraaj

+3

Rob vấn đề đã được giải quyết .. trước khi thiết lập nội dung của nó bây giờ tôi thay đổi kích thước xem web để một số giá trị mặc định và nhỏ hơn. .. nói, (15.0, 0.0, 560.0, 10.0) .. Tôi phải nói Rob Rocks! – Miraaj

+0

Khi tôi thay đổi DOM trong một số tương tác trong WebView mà kích hoạt thay đổi kích thước của vùng hiển thị của nó phương thức này 'webView: didFinishLoadForFrame' sẽ không được gọi lại, đúng không? Có một số đại biểu sẽ được gọi trong trường hợp này? BTW: Giải pháp của bạn không hiệu quả với tôi. Có lẽ bạn có thể giúp đỡ [ở đây] (http://stackoverflow.com/q/21992854/1146700)? – beipawel

2

Một cách khác là hỏi DOM về chiều cao của nội dung của bạn.

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

Điểm then chốt ở đây là đặt nội dung của bạn vào bên trong phần tử được đặt tên để getElementById có thể được sử dụng. Việc triển khai của tôi đã sử dụng phần tử <div id="foo"> đơn giản.

Trong trường hợp cụ thể của tôi, WebView của tôi nằm bên trong NSSplitView, vì vậy trước tiên hãy đặt lại chiều cao của WebView thành thứ gì đó nhỏ đã gây ra một nhấp nháy.

Tôi đã có dự án mẫu here minh họa.

+1

Điều này làm việc tốt hơn cho tôi hơn '[[khung khung [khung nhìn khung web] khung]] bởi vì nó luôn trả về giá trị thích hợp. Tôi không biết tại sao, nhưng 'documentView.frame' chỉ hoạt động khi một trang được tải lần đầu tiên, nếu không nó sẽ trả về kích thước trống (có thể là bacause của bộ nhớ đệm). – Darrarski

+0

Thật vậy, @ Darrarski - điều này thậm chí còn hoạt động sau khi thay đổi kích cỡ khung gor, tức là chiều rộng thay đổi, làm cho chiều cao nội dung cũng thay đổi, trong khi câu trả lời được chấp nhận không giúp ích trong trường hợp đó vì nó vẫn báo cáo kích thước ban đầu. –

Các vấn đề liên quan