2010-02-01 5 views
8

Nó trông giống như một vấn đề mà có thể có giải pháp đơn giản, nhưng tôi đã không tìm thấy bất cứ điều gì có thể dẫn đường đến nó. Tôi đang sử dụng UIWebView bên trong của UIScrollView và khai thác trên statusbar (để di chuyển nội dung lên trên) không hoạt động.UIScrollView + UIWebView = NO scrollsToTop

Tôi đã thực hiện ứng dụng thử nghiệm đơn giản để xem đó có phải là lỗi UIWebView hay không. Và nó thực sự là.

// scrolls to top on status bar tap 
UIScrollView *sv = [[UIScrollView alloc] init]; 
sv.frame = CGRectMake(0, 0, 320, 480); 
sv.contentSize = CGSizeMake(320, 1200); 
[self.view addSubview:sv]; 

// doesn't scroll 
UIScrollView *sv = [[UIScrollView alloc] init]; 
sv.frame = CGRectMake(0, 0, 320, 480); 
sv.contentSize = CGSizeMake(320, 1200); 

UIWebView *wv = [[UIWebView alloc] init]; 
wv.frame = CGRectMake(0, 0, 320, 100); 
[sv addSubview:wv]; 

[self.view addSubview:sv]; 

Vì vậy, tôi nghĩ rằng có lẽ có điều gì đó tôi có thể vô hiệu hóa để làm cho UIWebView không để gây rối với scrollToTop? Hoặc một số loại workaround cũng sẽ được tốt đẹp.

Bất kỳ ý tưởng nào?

Trả lời

7

Tôi đã chạy vào đêm cuối cùng này cho đến khi cuối cùng tôi tìm thấy câu trả lời được chôn trong một nhận xét về nhận xét. Các idea of that original post là khi bạn thêm UIWebView để UIScrollingView của bạn, bạn sử dụng như sau:

- (void) ensureScrollsToTop: (UIView*) ensureView { 
    ((UIScrollView *)[[webView subviews] objectAtIndex:0]).scrollsToTop = NO; 
} 

Điều này dường như tanh với tôi kể từ khi tiểu-view đầu tiên của một UIWebView tuyên bố là một UIScroller mà không phải là một lớp con của UIScrollView. Tuy nhiên, vì UIScroller hỗ trợ tài sản scrollsToTop, các diễn viên chỉ cho chúng ta một cách quá khứ cảnh báo trình biên dịch:

 
Class List: 
    Class = UIScroller 
    Class = UIView 
    Class = UIResponder 
    Class = NSObject 
Supported Methods: 
    ... 
    Method _scrollToTop 
    Method setScrollsToTop: 
    Method scrollsToTop 
    ... 
Supported Properties: 
    Property scrollsToTop 

EDIT: Chỉ cần một lưu ý nhanh chóng về nơi này thực sự cần phải xảy ra: trong callback webViewDidFinishLoad. Gọi nó trên UIWebView xây dựng là không đủ tốt vì tại thời điểm đó các UIWebView chưa tạo nó xem con nào, mà là những người gây ra vấn đề:

- (void)webViewDidFinishLoad:(UIWebView *) wv {  
    [self ensureScrollsToTop: wv]; 
} 

EDIT # 2:

bây giờ, trong iOS 5, như được ghi chú trong iPhone OS: Tap status bar to scroll to top doesn't work after remove/add back sử dụng scrollView @property mới của UIWebView, làm cho việc triển khai ensureScrollsToTop không cần thiết đối với các dự án không sử dụng các mục tiêu triển khai thấp hơn iOS 5.0.

+0

Cảm ơn nivekastoreth, điều này đã làm tôi thất vọng. Tôi chỉ muốn chỉ ra rằng bạn đang thiếu một '(' trong sureScrollsToTop và tôi muốn nhắc nhở bất cứ ai khác tìm thấy điều này để thiết lập các đại biểu của webview để webViewDidFinishLoad được gọi là –

+0

công trình này, nhưng bạn có thể có nghĩa là: ((UIScrollView *) [[webView subviews] objectAtIndex: 0]) scrollsToTop = YES; –

+0

Bộ nhớ của tôi về điều này hơi mờ vào lúc này, nhưng khi tôi nhớ lại, vấn đề là bạn cần đặt scrollsToTop thành NO vì vấn đề là nếu nhiều chế độ xem cuộn quay trở lại YES (khi chúng xâu chuỗi xuống qua con), nó thực sự vô hiệu hóa chức năng đó.Chỉ có duy nhất - nếu một và chỉ một chế độ xem cuộn trả về CÓ. – nivekastoreth

3

Trong hệ điều hành iPhone, nếu có nhiều hơn một UIScrollView (hoặc lớp con của nó, ví dụ UITableView, UIWebView) trong khung nhìn hiện tại, hệ thống không biết UIScrollView nào sẽ được cuộn lên trên cùng.

Sửa nhanh: cho tất cả các UIScrollView mà bạn không muốn hỗ trợ cuộnToTop, chỉ cần đặt scrollsToTop thành NO, sau đó mọi thứ hoạt động hoàn hảo.

self.scrollView1.scrollsToTop = NO; 
self.scrollView2.scrollsToTop = NO; 
self.scrollView1.scrollsToTop = YES; // by default scrollsToTop is set as YES, this line is not necessary 
0

Xem trước theo mặc định sẽ có YES để cuộn giá trịĐối với giá trị. Tôi đã viết một lớp đơn giản cho vấn đề cụ thể này. Trong ứng dụng của tôi, chúng tôi đang có nhiều lần xem và xem trang web. Điều này làm cho nó dễ dàng hơn nhiều.

https://gist.github.com/hfossli/6776203

Nó về cơ bản đặt scrollsToTop để NO trên tất cả các scrollViews khác so với cái bạn đang xác định.

0

Tôi muốn thêm trường hợp của tôi, tôi thêm một UIWebView trên một UIScrollView, as h4xxr said:

Nếu có nhiều hơn một điểm di chuyển một thông điệp scrollViewDidScrollToTop bị bỏ qua

Vì vậy, tôi nhận được một cách đơn giản để làm cho nó hoạt động trên webView: chỉ cần thiết lập scrollView · s scrollsToTop property false.

Và khi nhấn vào thanh trạng thái, nó sẽ không bị cuộn bởi scrollView và cuộn webView cuộn lên trên cùng!

UIScrollView *scrollView = [[UIScrollView alloc] init]; 
    scrollView.frame = self.view.bounds; 
    scrollView.scrollsToTop = false; //igore scrollView`s scrollsToTop 
    [self.view addSubview:scrollView]; 

    UIWebView *webView = [[UIWebView alloc] init]; 
    webView.frame = scrollView.bounds; 
    [scrollView addSubview:webView];