2013-04-19 8 views
13

मेरे पास 2 स्क्रॉल दृश्य हैं, जिनमें से दोनों लंबवत स्क्रॉल करना चाहते हैं। बाहरी स्क्रॉल व्यू (लाल) में एक खोज बार और आंतरिक स्क्रॉल व्यू (नीला) होता है। आंतरिक स्क्रॉल दृश्य असीमित रूप से स्क्रॉल करना माना जाता है (इसमें छवियां/आइटम होते हैं और अंतहीन स्क्रॉलिंग कार्यान्वयन होता है)।नेस्टेड UIScrollViews और ईवेंट रूटिंग

जब मैं नीचे स्क्रॉल, बाहरी स्क्रॉल दृश्य पहले स्क्रॉल करना चाहिए और खोज पट्टी गायब हो जाना चाहिए (सामग्री क्षेत्र से बाहर स्क्रॉल):

तरह से मैं काम करने के लिए इस नियंत्रक चाहते इस प्रकार है। उसके बाद ही आंतरिक स्क्रॉल दृश्य स्क्रॉलिंग शुरू कर देना चाहिए। बैक अप स्क्रॉल करते समय, आंतरिक स्क्रॉल दृश्य को अपने शीर्ष पर सभी तरह से स्क्रॉल करना चाहिए। केवल तभी बाहरी स्क्रॉल दृश्य को स्क्रॉल ईवेंट लेना चाहिए और आखिरकार खोज बार को फिर से दिखने के लिए स्क्रॉल करना चाहिए।

यदि मैं उन्हें किसी भी संशोधन के बिना आईबी में घोंसला करता हूं तो आंतरिक स्क्रॉल दृश्य सभी स्क्रॉल घटनाओं को पकड़ता है और यह दूसरी तरफ काम करता है।

कृपया ध्यान रखें कि मैं आंतरिक स्क्रॉल दृश्य का उपयोग सरल सरलीकृत रूपक के रूप में कर रहा हूं। मेरे ऐप में मेरे पास वास्तव में एक नियंत्रण है, जिसमें नेस्टेड टेबल दृश्यों के साथ एक स्क्रॉल व्यू है (स्क्रॉल व्यू मुझे पृष्ठ क्षैतिज रूप से देता है, टेबल दृश्य मुझे लंबवत स्क्रॉल करने देता है)।

enter image description here

+0

आप कभी भी इस के लिए एक समाधान है, या एक वैकल्पिक हल मिला बनाने? –

उत्तर

0

उपयोग सिर्फ एक scrollview और खोज पट्टी के लिए contentInset/contentOffset निर्धारित किया है। इस रेखा के साथ कुछ:

UIEdgeInsets oldEdgeInset = [[self scrollView] contentInset]; 
    CGRect f = [[self searchBar] frame]; 
    UIEdgeInsets newEdgeInset = UIEdgeInsetsMake(CGRectGetMaxY(f), 0, 0, 0); 
    CGPoint offset = [[self scrollView] contentOffset]; 
    offset.y += oldEdgeInset.top - newEdgeInset.top; 
    [[self scrollView] setContentOffset:offset]; 
    [[self scrollView] setContentInset:newEdgeInset]; 
    [[self searchBar] setFrame:f]; 
+0

दुर्भाग्य से, मेरे मामले में यह इससे थोड़ा अधिक जटिल है :(आंतरिक स्क्रॉल व्यू वास्तव में एक क्षैतिज पेजर है जिसमें एकाधिक टेबल दृश्य होते हैं। यह एक स्वयं निहित दृश्य है कि मैं आसानी से विस्तार नहीं कर सकता। मैं एक समाधान की तलाश में हूं एक ओवरलेइंग पर्यवेक्षण की दिशा में जो मुझे उचित स्क्रॉल दृश्यों पर घटनाओं को रूट करने देगी ... – Sebastian

0

मैं संरचना आप और लागू करना चाहते हैं के बारे में निश्चित नहीं हूँ ..

मैं एक परीक्षण परियोजना को खोजने here

बना दिया है लेकिन इस परियोजना निश्चित रूप से मदद मिलेगी विभिन्न स्क्रॉलव्यू को एक साथ प्रबंधित करने के लिए ..

हालांकि एप्लिकेशन सही नहीं हो सकता है, लेकिन समाधान को प्राप्त करने के लिए आपको कुछ विचार देगा।

आशा है कि यह मदद करता है ..

चीयर्स

0

आप बाहरी scrollview पर भीतरी scrollview जोड़नी होगी, भीतरी scrollview 'y' स्थिति बंद बाहरी scrollview तरह के सेट सामग्री होना चाहिए ...

innerScrollView.frame = CGRectMake(10, outerScrollView.contentSize.height, 300, 440); 

इसके बाद आप इस आंतरिक स्क्रॉल व्यू पर कोई भी दृश्य जोड़ सकते हैं, आप innerScrollView के लिए सामग्री ऑफसेट आदि सेट कर सकते हैं।

अंत में आपको बाहरी स्क्रॉलव्यू के लिए सामग्री आकार बढ़ाना चाहिए।

outerScrollView.contentSize = CGSizeMake(320, innerScrollView.frame.size.height+actualContentSizeOfOuterScroolView); 

मुझे लगता है कि यह आपके लिए मदद करता है!

1

मैंने एक स्क्रॉलव्यू के लिए उदाहरण दिया है, आपको समेकित स्क्रॉलव्यू बनाना है और गतिशील ऊंचाई और सामग्री आकार के आधार पर जोड़ना यह काम करेगा।

//।ज फ़ाइल

@property (nonatomic, strong) UIScrollView *scrlSearch; 

// मीटर फ़ाइल // viewDidLoad

scrlSearch = [[UIScrollView alloc] init]; 

// For first scroll screen height was ((total screen height/100)* 10%) 
// For Second scroll screen height was ((total screen height/100)* 90%) 
scrlSearch.frame = CGRectMake(0, 0, (YourScreenWidth), (YourScreenHeight)); 

// YourVIEW = add any view to scrollbar 
[scrlSearch addSubview:YourVIEW]; 

CGSize contentSize = scrlSearch.frame.size; 
// YourContentHeight = dynamic content or static content height 
contentSize.height = YourContentHeight; 

// set the ContentHeight for scrolling 
[scrlSearch setContentSize:contentSize]; 
// add the scrollview into delegate 
[scrlSearch setDelegate:self]; 
+6

मुझे खेद है, लेकिन यह भी एक जवाब कैसे है? – followben

+0

@followben मैंने UIscrollview का उपयोग करके कुछ उदाहरण किए हैं। यह मेरे लिए काम करता है मैंने इस कोड को साझा किया। – Karthik

2

आप करने में सक्षम हैं, तो 2 पुस्तक विचारों पर एक आम UIScrollViewDelegate निर्धारित करते हैं, और निम्नलिखित लागू :

- (void) scrollViewDidScroll: (UIScrollView*) scrollView 
{ 
    if (scrollView == self.mainScrollView) 
    { 
    /* Handle instances when the main scroll view is already at the bottom */ 
    if ( scrollView.contentOffset.y 
     == scrollView.contentSize.height - scrollView.bounds.size.height) 
    { 
     /* Stop scrolling the main scroll view and start scrolling the 
     * inner scroll view 
     */ 
     self.innerScrollView.scrollEnabled = YES; 
     self.mainScrollView.scrollEnabled = NO; 
    } 
    else 
    { 
     /* Start scrolling the main scroll view and stop scrolling the 
     * inner scroll view 
     */ 
     self.innerScrollView.scrollEnabled = NO; 
     self.mainScrollView.scrollEnabled = YES; 
    } 
    } 
    else if (scrollView == self.innerScrollView) 
    { 
    /* Handle instances when the inner scroll view is already at the top */ 
    if (self.innerScrollView.contentOffset.y == 0) 
    { 
     /* Stop scrolling the inner scroll view and start scrolling the 
     * main scroll view 
     */ 
     self.innerScrollView.scrollEnabled = NO; 
     self.mainScrollView.scrollEnabled = YES; 
    } 
    else 
    { 
     /* Start scrolling the inner scroll view and stop scrolling the 
     * main scroll view 
     */ 
     self.innerScrollView.scrollEnabled = YES; 
     self.mainScrollView.scrollEnabled = NO; 
    } 
    } 
} 

कृपया ध्यान दें कि मैंने इसका परीक्षण नहीं किया है, लेकिन तर्क कुछ हद तक ऐसा हो सकता है (या तो आप स्क्रॉलिंग सक्षम सेट करते हैं या आप उपयोगकर्ता इंटरैक्शन को अक्षम करते हैं, या कुछ)। संभवतः यह संभवतः एक समाधान का पर्याप्त नहीं होगा जैसा आप चाहें, लेकिन मुझे यकीन है कि एक सामान्य UIScrollViewDelegate आपकी समस्या का समाधान है।

+0

मैंने यह कोशिश की है और यह "थोडा" काम करता है। समस्या यह है कि स्क्रॉल/स्वाइप इशारा एक स्क्रोल व्यू से दूसरे स्थान पर स्थानांतरित नहीं किया जाता है, यदि आप इसे प्रस्तावित करते हैं तो आपको इसे खींचना होगा। आपको खींचना/दूसरी स्क्रॉल व्यू स्क्रॉलिंग पर फिर से स्वाइप करें। – Sebastian

+0

आप स्क्रॉल व्यू के पैनगेशर रिकॉग्नाइज़र का उपयोग उस वेग को लाने के लिए कर सकते हैं जिस पर उपयोगकर्ता पैनिंग कर रहा है, दोनों की गणना करें एनीमेशन अवधि और सामग्री डेल्टा ऑफसेट, और मुख्य स्क्रॉलव्यू या आंतरिक ScrollView पर एक पैन नकली जब दूसरा शीर्ष/नीचे पहुंच गया है। –

+1

@ सेबेस्टियन इस समस्या को हल करने के लिए आप क्या कर रहे हैं? – SAHM

0

अपने शीर्ष-दृश्य (सभी स्क्रॉल दृश्यों के ऊपर, अपने दृश्य नियंत्रक के दृश्य पर) के लिए एक स्वाइप इशारा पहचानकर्ता बनाएं, और इसे UISwipeGestureRecognizerDirectionUp पहचानें।

फिर, जब भी बाहरी स्क्रॉल व्यू स्क्रॉल करते हैं तो आपको अपने नियंत्रक को सूचित करने की आवश्यकता होती है। एक बार यह स्क्रॉल हो जाने के बाद, इशारा पहचानकर्ता जोड़ें। जब यह शीर्ष पर फिर से हिट करता है (outerScrollView.contentOffset == (0,0)), इशारा पहचानकर्ता को हटा दें।

इशारा सभी स्वाइप घटनाओं 'खाने' चाहिए, जबकि यह मौजूद है, अपने भीतर की पुस्तक विचारों स्पर्श घटना प्राप्त नहीं है और इसलिए स्क्रॉल नहीं होंगे

संबंधित मुद्दे