2009-07-25 28 views
9

Cách tốt nhất, đơn giản nhất hoặc cách khác (khách quan) đơn giản nhất để thêm một vài điều khiển (ví dụ: một số UIButtons) bên dưới một UIWebView là gì?Cách thêm các điều khiển bên dưới một UIWebView

Để rõ ràng, tôi muốn hiển thị UIWebView cuộn thường xuyên, nhưng khi cuộn xuống dưới cùng, tôi muốn có một số UIControls sau nội dung web. Tôi không muốn giả mạo nó với nội dung HTML/CSS trông giống như một điều khiển; lý tưởng là chúng phải là các điều khiển thực sự mà tôi có thể treo lên bộ điều khiển xem của tôi như bình thường.

Tôi không biết liệu cách dễ nhất để làm điều này với một UIScrollView lớn có chứa cả UIWebView và các điều khiển (sẽ có xung đột cuộn giữa UIScrollView và UIWebView lồng nhau?) Hoặc với UITableView có chứa xem web và kiểm soát trong các ô riêng biệt (hiệu suất sẽ là khủng khiếp?), hoặc theo một cách khác mà tôi đã không nghĩ đến.

Cập nhật: Tôi không tưởng tượng rằng tôi muốn chính UIWebView thực sự cuộn; Tôi nghĩ rằng tôi cần phải thay đổi kích thước để chứa tất cả nội dung của nó, tắt hoàn toàn hành vi cuộn của nó, và sau đó cho phép người dùng cuộn chế độ xem cha mẹ của nó (hoặc UIScrollView hoặc UITableView) để hiển thị các phần khác nhau của UIWebView.

+0

tôi đã kết thúc giả mạo nó với HTML và CSS. -webkit-appearance: nút ấn làm cho điều này trở nên ngon miệng hơn. Vấn đề với cách tiếp cận "một giao diện người dùng lớn" là lượt xem có kích thước tối đa 1024x1024 pixel, do đó bạn không nhất thiết phải tải toàn bộ trang vào một trang và dán vào bên trong UIScrollView. Bạn có thể cắt một trang lớn thành các trang nhỏ hơn và sử dụng riêng một UIWebView cho từng phần, nhưng điều này có vẻ như là một giải pháp tồi tệ hơn là chỉ cho vào và làm cho các nút của nội dung trang thực tế. –

Trả lời

8

Cả giải pháp UIScrollView lẫn UITableView mà bạn đã đề xuất đều không hoạt động.

Nếu bạn đặt UIWebView trong UIScrollView, một hoặc cái kia sẽ chặn các cuộn và cuộn ngăn nội dung của nó, nhưng cái kia sẽ không. Tôi không chắc cái nào sẽ, tôi nghĩ nó sẽ là UIScrollView. Trong mọi trường hợp, không có điều khoản nào cho UIScrollView cuộn khi bạn đến cuối cuộn trong UIWebView hoặc ngược lại.

Nếu bạn sử dụng UITableView, UIWebView sẽ cuộn bên trong ô, nhưng UITableView sẽ không cuộn chút nào hoặc UIWebView sẽ không cuộn chút nào và UITableView sẽ xuất hiện. Nếu bạn sử dụng kiểu bảng 'được nhóm', có thể bạn có thể cuộn UIWebView và UITableView, nhưng nó sẽ không phải là loại trải nghiệm cố kết mà bạn đang tìm kiếm. Kỹ thuật duy nhất mà tôi có thể nghĩ là có thể hoạt động là muck xung quanh trong nội bộ của UIWebView và thêm các nút có chứa UIView của bạn và không cho phép thực thể cuộn được sử dụng bởi UIWebView. Điều này nằm ngoài ken của tôi, nhưng these header dumps will get you started. Xin lưu ý rằng nếu Apple thông báo những gì bạn đang làm, họ có thể từ chối ứng dụng của bạn và ngoài ra, nội bộ có thể thay đổi bất kỳ lúc nào, vi phạm mã của bạn. Nếu bạn đi tuyến đường này, hãy thử mã nó theo cách mà chức năng bị thiếu sẽ gây ra một thất bại duyên dáng.

EDIT:

Với một số cuộc thảo luận và thử nghiệm, OP và tôi đã đi đến kết luận rằng nó là rất tốt, và có một cách để làm điều đó mà không dựa vào internals ở tất cả. Tức là, sử dụng chế độ xem cuộn kèm theo và thay đổi kích thước chế độ xem web khi nó đã được tải về kích thước đầy đủ của chế độ xem nội dung riêng. Kích thước này có thể được tìm thấy bằng cách sử dụng [webView sizeThatFits: CGSizeZero].

Nếu bạn muốn sử dụng lối đi riêng UIWebView để thực hiện điều này, tôi có một ví dụ mã ngắn thêm một cái nhìn để xem tài liệu của UIWebView, kể từ khi tôi đã nhận nó tất cả làm việc ra anyway :)

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // Override point for customization after app launch 
    UIView* testView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease]; 
    UIWebView* testWebView = [[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease]; 
    [testView addSubview:testWebView]; 
    [testWebView setDelegate:self]; 
    [testWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]]; 



    [window addSubview:testView]; 
    [window makeKeyAndVisible]; 
} 
- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    UIView *insert = [[[UIView alloc] initWithFrame:CGRectMake(0, [[webView _documentView] frame].size.height, 320, 40)] autorelease]; 
    [insert setBackgroundColor:[UIColor greenColor]]; 
    [[webView _documentView] addSubview:insert]; 
} 
+0

Cảm ơn bạn đã trả lời toàn diện và chu đáo. Tuy nhiên, tôi không muốn UIWebView cuộn tất cả nội dung của nó (nghĩa là một số màn hình cao), và chỉ di chuyển khung nhìn cha để tiết lộ một phần khác của UIWebView (và cuối cùng là các điều khiển bên dưới nó). Điều đó không thể đạt được? –

+0

Thực ra điều đó có thể đạt được. Bạn sẽ phải tải yêu cầu (với scalesPageToFit = NO), tìm hiểu độ cao của trang bằng cách nào đó và điều chỉnh lại mọi thứ để phù hợp với nội dung đó trong UIScrollView của riêng bạn. Vấn đề duy nhất tôi thấy là tìm hiểu xem trang thực sự cao bao nhiêu. Điều đó tự nó có thể yêu cầu mucking về trong internals; UIWebView biết cách cho biết chế độ xem nội dung của nó là gì, nhưng tôi không chắc có cách nào dễ dàng để nó cho bạn biết. Tôi đang không sử dụng một số mã thử nghiệm ngay bây giờ, tôi sẽ cho bạn biết nó như thế nào. –

+0

Rực rỡ. Cảm ơn một lần nữa. Có [webView sizeThatFits: CGSizeZero] không làm thủ thuật? (http://www.iphonedevsdk.com/forum/iphone-sdk-development/1388-getting-actual-content-size-uiwebview.html) –

1

Tôi không tin rằng có bất kỳ cách nào để thực hiện việc này trong các hạn chế của SDK công khai.

+0

Oh dear. Liệu UIScrollView và UITableView có hoạt động tốt không? Tại sao không? –

0

này là cách tôi làm điều đó.

- (void)webViewDidFinishLoad:(UIWebView *)webView { 


for(UIView *view in [webView subviews]){ 

    if([view isKindOfClass:[UIScrollView class]]){ 
     NSLog(@"Scrollview found with tag %d", [view tag]); 

     UIScrollView *scroll= (UIScrollView *)view; 
     [scroll addSubview:self.finishBtn]; 
     [finishBtn setCenter:CGPointMake(webView.center.x, scroll.contentSize.height-30)]; 
    } 


} 

}

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