6

मैं एक अनंत स्क्रॉलिंग कैलेंडर लागू कर रहा हूं। मेरी समस्या यह है कि मैं वर्तमान महीने को नेविगेशन बार में शीर्षक के रूप में सेट करना चाहता हूं और इसे स्क्रॉल करते समय अपडेट करना चाहिए - एक बार जब आप सेक्शन हेडर पास करते हैं तो शीर्षक को एनएवी बार में अपडेट करना चाहिए।UICollectionView में किसी नए अनुभाग में स्क्रॉलिंग का पता लगाने के लिए कैसे?

एक संभावित समाधान - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath नामक विधि में दृश्य शीर्षक सेट करना होगा ताकि जब मैं एक नए सेक्शन हेडर की गणना करता हूं, तो यह शीर्षक को भी अपडेट करता है। इसके साथ समस्या यह है कि नया अनुभाग पृष्ठ के निचले हिस्से में होने पर शीर्षक बदलता है।

Currently displaying the Section Header as title, not optimal

वहाँ एक रास्ता UICollectionView की "वर्तमान अनुभाग" पता करने के लिए एक बार उपयोगकर्ता इसे करने के लिए स्क्रॉल किया गया है? या क्या आप मेरे वर्तमान समाधान को बेहतर बनाने के तरीके के बारे में सोच सकते हैं?

इस पोस्ट के पाठकों की सहायता के लिए, मैंने इस प्रश्न के लिए अपना स्वयं का नमूना कोड इस GitHub repo पर पोस्ट किया। विधि viewForSupplementaryElementOfKind में रेखा से नीचे

+0

क्या आपको वांछित व्यवहार प्राप्त करने का समाधान मिला? – Joey

+0

हैलो @ जॉय मेरा जवाब जांचें। – KDeogharkar

उत्तर

0

परिवर्तन:

self.title = [df stringFromDate:[self dateForFirstDayInSection:indexPath.section]]; 
इस के लिए

:

if(![[self dateForFirstDayInSection:indexPath.section-1] isKindOfClass:[NSNull class]]){ 
     self.title = [df stringFromDate:[self dateForFirstDayInSection:indexPath.section-1]]; 
} 

आशा है कि यह आप में मदद मिलेगी।

+0

हां इसने विशिष्ट समस्या हल की। धन्यवाद! – maggix

+0

यह तब काम नहीं करेगा जब अगला हेडर स्क्रीन पर दिखाई नहीं दे रहा है, और जब आप स्क्रॉल करते हैं तो पिछले अनुभाग से पहले शीर्षक बदल जाता है। – Joey

0

हां, समस्या यह है कि पाद लेख और हेडर दृश्यकल्स संग्रह में मौजूद नहीं हैं। सेक्शन हेडर/फ़ूटर के लिए स्क्रॉल का पता लगाने का दूसरा तरीका है। बस वहां एक नियंत्रण जोड़ें और इसके लिए rect खोजें। इस तरह:

func scrollViewDidScroll(scrollView: UIScrollView) { 

    if(footerButton.tag == 301) 
    { 
     let frame : CGRect = footerButton.convertRect(footerButton.frame, fromView: self.view) 
     //some process for frame 
    } 


} 
2

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

अनिवार्य रूप से, जब भी स्क्रॉल स्थिति बदलती है तो आपको यह जानने की आवश्यकता होती है कि उपयोगकर्ता किस अनुभाग पर है और शीर्षक को अपडेट करता है। UIScrollViewDelegate पर आप इसे scrollViewDidScroll के माध्यम से करते हैं - संग्रह दृश्य को याद रखना एक स्क्रॉल व्यू है। सभी शीर्षकों पर लूप करें और नकारात्मक ऑफ़सेट होने के बिना वर्तमान स्क्रॉल स्थिति के सबसे नज़दीक को ढूंढें। ऐसा करने के लिए, मैंने एक ऐसी संपत्ति का उपयोग किया जो प्रत्येक अनुभाग शीर्षलेख की स्थिति का सरणी संग्रहीत करता है। जब कोई हेडर बनाया जाता है, तो मैं उचित स्थिति में सरणी में अपनी स्थिति संग्रहीत करता हूं। एक बार जब आपको हेडर मिल जाए जो आपकी स्क्रॉल स्थिति (या कहा गया हेडर का इंडेक्स लोकेशन) के निकट है, तो उपयुक्त शीर्षक के साथ नेविगेशन बार में शीर्षक को अपडेट करें।

viewDidLoad में, प्रत्येक अनुभाग के लिए NSNull के साथ सरणी संपत्ति को भरने के तुम हो:

NSNumber *position = [NSNumber numberWithFloat:headerView.frame.origin.y + headerView.frame.size.height]; 
[self.sectionHeaderPositions replaceObjectAtIndex:indexPath.section withObject:position]; 

scrollViewDidScroll: में:

self.sectionHeaderPositions = [[NSMutableArray alloc] init]; 
for (int x = 0; x < self.sectionTitles.count; x++) { 
    [self.sectionHeaderPositions addObject:[NSNull null]]; 
} 

collectionView:viewForSupplementaryElementOfKind:atIndexPath: में, बनाया हैडर दृश्य की स्थिति के साथ सरणी अद्यतन , उस स्क्रॉल स्थिति के लिए प्रदर्शित करने के लिए कौन सा शीर्षक उपयुक्त है यह निर्धारित करने के लिए गणना करें:

CGFloat currentScrollPosition = self.collectionView.contentOffset.y + self.collectionView.contentInset.top; 
CGFloat smallestPositiveHeaderDifference = CGFLOAT_MAX; 
int indexOfClosestHeader = NSNotFound; 

//find the closest header to current scroll position (excluding headers that haven't been reached yet) 
int index = 0; 
for (NSNumber *position in self.sectionHeaderPositions) { 
    if (![position isEqual:[NSNull null]]) { 
     CGFloat floatPosition = position.floatValue; 
     CGFloat differenceBetweenScrollPositionAndHeaderPosition = currentScrollPosition - floatPosition; 
     if (differenceBetweenScrollPositionAndHeaderPosition >= 0 && differenceBetweenScrollPositionAndHeaderPosition <= smallestPositiveHeaderDifference) { 
      smallestPositiveHeaderDifference = differenceBetweenScrollPositionAndHeaderPosition; 
      indexOfClosestHeader = index; 
     } 
    } 
    index++; 
} 
if (indexOfClosestHeader != NSNotFound) { 
    self.currentTitle.text = self.sectionTitles[indexOfClosestHeader]; 
} else { 
    self.currentTitle.text = self.sectionTitles[0]; 
} 

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

यदि कोई इसे अधिक कुशल बनाने या अन्यथा बेहतर बनाने के लिए इस पर सुधार कर सकता है तो कृपया करें और मैं तदनुसार उत्तर अपडेट करूंगा।

+0

हाय जॉय, विस्तृत उत्तर के लिए धन्यवाद! – maggix

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