2012-10-12 13 views
15

ले जाया नहीं किया जा सकता UICollectionView सजावट में और अनुपूरक बार देखा गया एक बड़ा रहस्य होने लगते हैं। इस समय कोई उदाहरण कोड के बगल में प्रतीत होता है। मैं कस्टम लेआउट में दोनों प्रकार के काम करने में कामयाब रहा (कुछ विवरणों के लिए यह post देखें)। जब तक वे एक ही स्थिति में रहते हैं तब तक सब ठीक है (यानी यदि उनके layoutAttributes.frame नहीं बदलते हैं)।UICollectionView सजावट और पूरक विचारों

हालांकि जैसे ही मैं सजावट या पूरक विचारों के लिए layoutAttributes बदलकर बदलता हूं, वे दृष्टि से डुप्लिकेट प्राप्त करते हैं - यानी पृष्ठभूमि में उनकी मूल स्थान पर एक प्रतिलिपि होती है और उनकी प्रतिलिपि एक प्रतिलिपि होती है। व्यवहार समान है यदि मैं उन्हें XIB से पूरी तरह से या कोड में पूरी तरह से चालू करता हूं और व्यवहार सामान्य कोशिकाओं के लिए नहीं होता है।

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

किसी को भी इस काम के मिल गया या किसी विचार है है। मुझे यह कहना होगा कि मैं आईओएस मंच के लिए नया हूं, इसलिए यह "क्लिप बाउंड" या "साफ़ ग्राफिक्स संदर्भ" गुणों को सेट करने जैसी सरल चीजें भी हो सकती है (मैंने उनको आजमाया, लेकिन यह कुछ समान हो सकता है)।

यह मुझे पागल गाड़ी चला रहा है और यह वहाँ बिल्कुल कोई उदाहरण कोड है कि अजीब है।

मैं अपने आप को पूछ रहा हूँ: क्या सजावट और अनुपूरक विचारों मतलब नहीं पुनर्निर्धारित किए जाने की? (मुझे उम्मीद नहीं है)

+0

आपकी तरह की समस्या। मैं उन्हें पुनर्स्थापित नहीं करता हूं, फिर भी संग्रह दृश्य पर बैच अपडेट करते समय उन्हें डुप्लिकेट किया जाएगा। – YuAo

+0

बस FYI यह प्रकट नहीं होता है अगर आप PerformBatchUpdates को कॉल नहीं करते हैं या यदि आप MoveVtem के साथ नहीं खेलते हैं, तो SendVem से हटाएं या डालें Item। लेकिन आप किसी भी एनीमेशन को खो देते हैं ... – foOg

+0

मैं वही चीज़ देख रहा हूं - लेकिन डेटा को फिर से लोड करने पर, रिलाउट करने पर नहीं। मैंने सब कुछ साफ़ करने के लिए अपने कस्टम सेल में प्रीपेयर फोरर्यूज लागू किया है, लेकिन फिर भी डुप्लिकेट डेटा देखें (नया डेटा पुराने पर ओवरलैड हो जाता है)। – StephenT

उत्तर

1

मुझे एक ही समस्या थी। ऐसा लगता है कि UICOllectionview के साथ कुछ बग हैं (यह मैंने देखा पहला नहीं है)। मैंने इसे "performBatchUpdates" का उपयोग न करके तय किया है। मैं एनीमेशन खो देता हूं - लेकिन सूची में कोई अवांछित दृश्य नहीं है।

0

मुझे लगता है कि एप्पल सजावट विचारों है कि वे के रूप में इरादा काम कर रहे हैं के मामले में कम से कम इंगित करने के लिए जा रहा है। मैं इस समस्या में भाग गया क्योंकि मैं अंतिम खंड का पुन: आकार बदल रहा था और अनुभागों को घेरने के लिए सजावट दृश्य को स्थापित करने की कोशिश कर रहा था। पहले एक साधारण दृश्य का उपयोग करना कि सिर्फ लाल पृष्ठभूमि थी, मेरे ऐप की पूरी पृष्ठभूमि लाल हो गई और इससे मुझे भ्रमित कर दिया गया। मैंने बाद में सजावट के दृश्यों के लेआउट विशेषताओं पर अल्फा को 0.3f में बदल दिया और मैं उन्हें एक-दूसरे पर परत देखने में सक्षम था क्योंकि अनुभाग बदल गए थे।

क्या वास्तव में मुझे बंद टिप है कि इस डिजाइन हो सकता है, हालांकि एक लाइन मैं UICollectionView

दूसरी ओर पर एक ट्यूटोरियल में पढ़ा था द्वारा, सजावट विचारों "सजावटी" कर रहे हैं के बजाय डेटा के आधार पर: iBooks ऐप में बुकशेल्फ़ बैकड्रॉप के बारे में सोचें।

महत्वपूर्ण यह है कि सजावट दृश्य डेटा पर ही आधारित नहीं हैं और के रूप में अपने डेटा यदि आप कस्टम लेआउट में ऐसा करने में सक्षम होने की परवाह किए बिना बदल जाता है नहीं बदल रहा है किया जाना चाहिए। बुकशेल्फ़ के मामले में अलमारियों का आकार उनके निर्माण के बाद नहीं बदलता है।

10

हाय यह एक पुराना सवाल है लेकिन इसके लिए एक जवाब है।

असल में मैं इन मुद्दों को भी जब मैं अपने खुद के लेआउट वस्तु लागू किया था, जब तक मुझे एहसास हुआ कि यह जरूरी है किसी भी लेआउट का श्रेय आप अपने कस्टम लेआउट में बनाने वस्तुओं कैश करने के लिए।दस्तावेज़ीकरण में वास्तव में इसका एक बहुत ही अस्पष्ट संदर्भ है (अब मुझे सटीक स्थान याद नहीं है) जिसे बहुत आसानी से गलत व्याख्या किया गया है।

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

+3

यदि संग्रह दृश्य 'UICollectionViewLayoutAttributes' उदाहरणों की तुलना करने के लिए' isEqual' का उपयोग कर रहा है, तो एक गहरी तुलना के साथ 'isEqual' को ओवरराइड करने से ऑब्जेक्ट्स को बनाए रखने के बिना समस्या हल हो सकती है। –

0

मुझे पता है कि यह एक पुराना सवाल है, लेकिन जब मैं एक लेआउट को अमान्य करते समय पूरक विचारों के साथ समस्याओं को डुप्लीकेट कर रहा हूं, तो मैं इस पर आया। मेरा मानना ​​है कि यह एक बग है, और मैं अपने लेआउट वस्तु में invalidateLayout ove सवारी और नीचे के रूप में अनुपूरक विचारों को निकाल कर उसे ठीक किया:

- (void)invalidateLayout { 
    [super invalidateLayout]; 
    // Manually remove all suplementary views of a certain type 
    /** 
    ** This appears to be a BUG. Invalidate view does not remove suplementary view 
    **  from the view hierachy. But they are Orphaned so stay on screen. 
    **/ 
    for (UIView *subview in [self.collectionView subviews]) { 
     if ([subview isKindOfClass:[UICollectionReusableView class]]) { 
      [subview removeFromSuperview]; 
     } 
    } 
} 

अपने पुनः प्रयोग करने योग्य देखने के वर्ग है कि पर छोड़ दिया जा रहा साथ UICollectionReusableView बदलें स्क्रीन।

उम्मीद है कि यह किसी की मदद करेगा।

0

मेरे पास एक समान लक्षण था। मेरी समस्या यह थी कि मैंने अपने कस्टम लेआउट को बनाते समय kindID के बजाय पूरक दृश्य के reuseID को गलती से शामिल किया था।

विशेष रूप से मैं था इस (गलत)

UICollectionViewLayoutAttributes *attributes = 
    [UICollectionViewLayoutAttributes 
    layoutAttributesForSupplementaryViewOfKind:myViewReuseID 
    withIndexPath:sectionIndexPath]; 

जब मैं इस (सही)

UICollectionViewLayoutAttributes *attributes = 
    [UICollectionViewLayoutAttributes 
    layoutAttributesForSupplementaryViewOfKind:myViewKindID 
    withIndexPath:sectionIndexPath]; 

मतलब यह कि prepareForReuse कहा जाता हो रही है कभी नहीं गया था, और मेरे पुराने विचारों होनी चाहिए कभी नहीं चला गया। इसके बजाय वे पिलिंग रखी।

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