2012-11-26 9 views
7

हमारे पास UITableView (यह लंबवत स्क्रॉल) के समान एक कस्टम लेआउट के साथ एक UICollectionView है। UICollectionView केवल 3 कोशिकाओं को एक साथ प्रदर्शित करता है, उनमें से एक वर्तमान में सक्रिय सेल होने के साथ: (। यहाँ सक्रिय कक्ष # 2 है)स्क्रॉल व्यू को ऑफ़सेट करना UICollectionView/UITableView में समय-समय पर गायब होने वाली कोशिकाओं का कारण बनता है

[ 1 ] 
[*2*] 
[ 3 ] 

कोशिकाओं मोटे तौर पर 280 अंक अधिक है, इसलिए केवल सक्रिय कक्ष पूरी तरह से है स्क्रीन पर दिखाई दे रहा है। उपयोगकर्ता सीधे नेविगेट करने के लिए दृश्य को स्क्रॉल नहीं करता है, इसके बजाय, वह अगले सेल पर अग्रिम करने के लिए सक्रिय सेल क्षैतिज रूप से स्वाइप करती है। हम तो कुछ फैंसी एनिमेशन करते हैं और UICollectionView स्क्रॉल तो अगले सेल "सक्रिय" स्थिति में है, इस प्रकार, यह सक्रिय एक बना पुराने दूर जा रहा है और कतार में अगले सेल परवरिश:

[ 2 ] 
[*3*] 
[ 4 ] 

यहां समस्या UICollectionView के ऑफ़सेट को सेट कर रही है। वर्तमान में हम इसे एक यूआईवीव एनीमेशन ब्लॉक (self.collectionView.contentOffset = targetOffset;) में तीन अन्य एनिमेटिंग गुणों के साथ सेट करते हैं, जो अधिकतर काम करता है, लेकिन पहले सेल (पहले सक्रिय, बाद के मामले में, # 2) को एनीमेशन के रूप में गायब होने का कारण बनता है विलंब अंतराल पूरा होने से पहले भी चलना शुरू होता है। यह निश्चित रूप से आदर्श नहीं है।

मैं कुछ समाधान के बारे में सोचा है, लेकिन सबसे अच्छा एक को समझ नहीं सकता:

  1. मूर्खता से तीन के बजाय पांच कोशिकाओं फिट करने के लिए UICollectionView के फ्रेम विस्तार, इस प्रकार में कोशिकाओं को रखने के लिए मजबूर स्मृति अगर वे ऑफस्क्रीन हैं। मैंने यह कोशिश की है और यह काम करता है, लेकिन यह एक बहुत गंदे हैक की तरह लगता है।

  2. गायब होने वाली सेल की प्रस्तुत सामग्री का एक स्नैपशॉट लें, इसे UIImageView में डालें, UIImageView को स्क्रॉल व्यू के एक सबव्यू के रूप में जोड़ें, सेल को पुराने सेल की सटीक स्थिति में दूर जाने से ठीक पहले, इसे हटा दें एक बार एनीमेशन समाप्त हो जाता है। पिछले विकल्प की तुलना में कम चूसने लगता है (स्मृति-वार, कम से कम), लेकिन फिर भी थोड़ी हैकी। मैं इसे पूरा करने का सबसे अच्छा तरीका भी नहीं जानता, कृपया मुझे सही दिशा में इंगित करें।

    1. UIScrollView के setContentOffset:animated: में स्विच करें। हम वास्तव में इसका इस्तेमाल करते थे, और यह गायब सेल समस्या को ठीक करता था, लेकिन अन्य यूआईवीव एनिमेशन के साथ समानांतर में इसे चलाने से मुख्य धागे के ध्यान के लिए प्रतिस्पर्धा होती है, इस प्रकार सिंगल-कोर डिवाइस पर एक बहुत ही चतुर एनीमेशन (आईफोन 3 जीएस/4)। यह हमें एनीमेशन की अवधि या easing बदलने की अनुमति नहीं देता है, इसलिए यह बाकी के साथ सिंक से बाहर लगता है। फिर भी एक विकल्प अगर हम इसे UIView ब्लॉक एनिमेशन के अनुरूप बनाने के लिए एक रास्ता खोज सकते हैं।

    2. UICollectionView के scrollToItemAtIndexPath:atScrollPosition:animated: पर स्विच करें। इसने कोशिश नहीं की है, लेकिन इसका एक बड़ा नकारात्मक पक्ष है: लक्ष्य स्क्रॉल स्थिति के लिए केवल 3 संभावित स्थिरांक (जो कम से कम इस मामले पर लागू होते हैं) लेते हैं: UICollectionViewScrollPositionTop, UICollectionViewScrollPositionCenteredVertically और UICollectionViewScrollPositionBottom। सक्रिय सेल इसकी ऊंचाई बदल सकता है, लेकिन यह हमेशा विंडो के शीर्ष से 35 अंक होना चाहिए, और ये विकल्प डिज़ाइन को पूरा करने के लिए पर्याप्त नियंत्रण प्रदान नहीं करते हैं। यह संभावित रूप से 3.1 के रूप में समस्याग्रस्त हो सकता है। अभी भी एक विकल्प है क्योंकि स्क्रॉल स्थिति की चीज़ के आसपास जाने का कोई तरीका हो सकता है जिसे मैं नहीं जानता, और इसमें मुख्य धागे के साथ एक ही समस्या नहीं हो सकती है, जो असंभव प्रतीत होता है।

किसी भी मदद की बहुत सराहना की जाएगी। कृपया पूछें कि क्या आपको स्पष्टीकरण की आवश्यकता है या नहीं। आपका बहुत बहुत धन्यवाद!

उत्तर

4

मैं # 2 के साथ गया। यहाँ स्निपेट होता है, प्रतिपादन और भंडारण करता है:

UIGraphicsBeginImageContext(theCell.bounds.size); 
[theCell.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *renderedCellImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

विधि के बाकी काफी के रूप में मैं एक चेतावनी के साथ ऊपर वर्णित है, था: इस से पहले छवि वास्तव में प्रयोग किया जाता है किया है और एक पृष्ठभूमि धागे पर किया जाना है , क्योंकि प्रतिपादन आईफोन 4 पर 1 पूर्ण सेकेंड तक ले सकता है। उम्मीद है कि यह किसी की मदद करेगा।

-1

लॉन्गशॉट: UIViewAnimationOptionBeginFromCurrentState पर UIView एनीमेशन ब्लॉक विकल्प सेट करने का प्रयास करें।

[UIView animateWithDuration:1 
         delay:0 
        options:UIViewAnimationOptionBeginFromCurrentState 
       animations:^{ } 
       completion:^(BOOL completed){ } ]; 
+0

उत्तर के लिए धन्यवाद। बाहर निकलता है, ब्लॉक में पहले से ही वह विकल्प था, ऐसा कोई फर्क नहीं पड़ता है। – radutzan

+0

इससे मेरी मदद नहीं हुई। –

2

मुझे एनीमेशन ब्लॉक में सामग्री ऑफ़सेट सेट करने के तुरंत बाद उन्हें फिर से लोड करके दिखाई देने के लिए कोशिकाओं को दिखाई देने लगा।

UIView.animateWithDuration(0.3) { 
    self.collectionView.contentOffset = newOffset 
    self.collectionView.reloadItemsAtIndexPaths(willDisappearIndexPaths) 
} 
संबंधित मुद्दे