2010-02-01 4 views
8

ऐसा लगता है कि एक समस्या है जो सरल समाधान हो सकता है, लेकिन मुझे ऐसा कुछ भी नहीं मिला जो इसके रास्ते का कारण बन सके। मैं UIScrollView के अंदर UIWebView का उपयोग कर रहा हूं और स्टेटसबार (शीर्ष पर सामग्री स्क्रॉल करने के लिए) पर टैप कर रहा हूं।UIScrollView + UIWebView = NO scrollsToTop

मैंने यह देखने के लिए सरल परीक्षण आवेदन किया है कि यह वास्तव में UIWebViews गलती है या नहीं। और यह वास्तव में है।

// 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]; 

तो, मुझे लगता है कि हो सकता है कि वहाँ कुछ मैं UIWebView scrollToTop साथ गड़बड़ करने के लिए नहीं करने के लिए इसे अक्षम कर सकते है? या किसी तरह का कामकाज भी अच्छा होगा।

कोई विचार?

उत्तर

7

मैं इस आखिरी रात में भाग गया जब तक कि मुझे अंत में एक टिप्पणी में टिप्पणी में दफन नहीं किया गया।

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

यह एक UIWebView के पहले उप देखे जाने के बाद मेरे लिए गड़बड़ लग रहा था एक UIScroller जिनमें से एक उपवर्ग नहीं है होने का दावा: idea of that original post कि जब आप अपने UIScrollingView को UIWebView जोड़ने के लिए, आप निम्नलिखित का उपयोग है UIScrollView। हालांकि, बाद से UIScroller scrollsToTop संपत्ति का समर्थन करता है, डाली बस हमें एक तरह से अतीत संकलक चेतावनी देता है:

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

संपादित करें: webViewDidFinishLoad कॉलबैक में: बस जहां यह वास्तव में होने की जरूरत के बारे में एक और एक संक्षिप्त संदेश।

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

संपादित करें # 2:: UIWebView निर्माण पर यह कॉलिंग जो समस्या का कारण होते हैं क्योंकि उस समय UIWebView यह अभी तक बच्चे को देखा गया है नहीं बनाई है पर काफी अच्छा नहीं है,

अब, आईओएस 5 में, जैसा कि iPhone OS: Tap status bar to scroll to top doesn't work after remove/add back में उल्लेख किया गया है, UIWebView के नए @property scrollView का उपयोग करें, ensureScrollsToTop कार्यान्वयन उन परियोजनाओं के लिए अनावश्यक है जो आईओएस 5.0 से कम परिनियोजन लक्ष्य का उपयोग नहीं कर रहे हैं।

+0

धन्यवाद nivekastoreth, यह मुझे परेशान कर रहा था। मैं बस यह इंगित करना चाहता हूं कि आप एक '(' सुनिश्चित कर रहे हैं 'स्क्रॉल ट्यूटॉप में और मैं किसी और को याद दिलाना चाहता हूं जो इसे वेबव्यू के प्रतिनिधि को सेट करने के लिए पाता है, इसलिए वेबव्यूडिडफिनिशलोड को कॉल किया जाता है। –

+0

यह काम करता है, लेकिन शायद आपको इसका मतलब है: ((UIScrollView *) [[वेब दृश्य सबव्यू] ऑब्जेक्टएट इंडेक्स: 0])। ScrollsToTop = हाँ; –

+0

इस समय मेरी यादें थोड़ी अस्पष्ट है, लेकिन जैसा कि मुझे याद है, मुद्दा यह है कि आपको स्क्रॉल सेट करने की आवश्यकता है क्योंकि समस्या यदि एकाधिक स्क्रॉलिंग दृश्य हाँ (जैसे वे बच्चों के माध्यम से चेन करते हैं) लौटते हैं तो यह वास्तव में उस कार्यक्षमता को अक्षम करता है। यह केवल-सक्षम है- यदि एक और केवल एक स्क्रॉलिंग दृश्य हाँ देता है। – nivekastoreth

3

आईफोन ओएस में, यदि मौजूदा दृश्य नियंत्रक में एक से अधिक UIScrollView (या इसके सबक्लास, उदाहरण के लिए UITableView, UIWebView) है, तो सिस्टम नहीं जानता कि कौन से UIScrollView को शीर्ष पर स्क्रॉल किया जाना चाहिए।

त्वरित सुधार: सभी UIScrollViews के लिए जिन्हें आप scrollsToTop का समर्थन नहीं करना चाहते हैं, बस स्क्रॉल को टोटॉप के रूप में सेट करें, फिर हर चीज सही काम करती है।

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

WebViews डिफ़ॉल्ट रूप से scrollsToTop-मूल्य के लिए YES होगा। मैंने इस विशिष्ट मुद्दे के लिए एक साधारण वर्ग लिखा है। मेरे ऐप में हमारे पास कई वेबव्यू और स्क्रॉलव्यू हैं। यह सब बहुत आसान बनाता है।

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

यह मूल रूप से एक आप निर्दिष्ट करते हैं के अलावा अन्य सभी scrollViews पर NO को scrollsToTop सेट।

0

मैं अपने मामले को जोड़ना चाहते हैं, मैं एक UIScrollView पर एक UIWebView जोड़ने के लिए, as h4xxr said:

यदि वहाँ एक से अधिक स्क्रॉलिंग दृश्य एक scrollViewDidScrollToTop संदेश

तो नजरअंदाज कर दिया है, मैं इसे वेब व्यू पर काम करने का एक आसान तरीका: बस स्क्रॉल व्यू स्क्रॉल सेट करें ToTop प्रॉपर्टी झूठी।

और जब स्टेटस बार टैप करें, तो इसे स्क्रॉल व्यू द्वारा अवरुद्ध नहीं किया गया, और वेब दृश्य शीर्ष पर स्क्रॉल किया गया!

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