2012-09-30 20 views
19

संरक्षण नहीं मैंने देखा है कि जब एक UICollectionView में setLayout:animated बुला दो लेआउट के बीच स्विच करने के लिए, वर्तमान में दृश्यमान सेल zIndex यह है लेआउट गुण layoutAttributesForItemAtIndexPath: में स्थापित किया गया है का पालन नहीं करता।UICollectionView setLayout: एनिमेटेड: zindex

उदाहरण के लिए, अगर मैं एक UICollectionViewUICollectionViewFlowLayout साथ के लिए गए थे, सेट यह एक नकारात्मक संख्या के लिए minimumLineSpacing है, तो कोशिकाओं ओवरलैप और उसके बाद प्रत्येक कोशिका पिछले सेल की तुलना में अधिक पर एक zIndex निर्धारित करते हैं, तो यह रूप में अगर प्रकट होता है कोशिकाओं को नीचे से ढेर कर रहे हैं।

हालांकि यदि मैं लेआउट को किसी अन्य लेआउट में सेट करता हूं तो उस मूल लेआउट पर वापस ले जाता है। ऐसा लगता है कि वर्तमान में दृश्यमान सेल zIndex नहीं सुनता है और अन्य कोशिकाओं के ऊपर रखा गया है। अगर मैं सेल ऑफस्क्रीन स्क्रॉल करता हूं तो उस पर वापस सही जगह पर है।

उत्तर

1

में z- सूचकांक सेट करके देखें:

- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath; 
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath; 
+0

उत्तर के लिए धन्यवाद हालांकि मेरे पास आपके समाधान के साथ कोई भाग्य नहीं है। मुझे लगता है कि मुद्दा यह है कि UICollectionView चयनित सेल के zIndex के साथ कुछ करता है। मैं गलत हो सकता हूं लेकिन लेआउट बदलना '' प्रारंभिक LayoutAttributesForAppearingItemAtIndex'' को कॉल नहीं कर सकता है यदि सेल पहले से दिखाई दे रहा है और लेआउट परिवर्तन में दिखाई देता है। – sampage

+0

मैंने अभी इसका एक त्वरित उदाहरण तैयार किया है और जेड-इंडेक्स के साथ मुद्दों को पुन: उत्पन्न करने में सक्षम था। यह मेरी समझ थी कि 'प्रारंभिक LayoutAttributesForAppearingItemAtIndex' को अमान्यता (एनिमेटेड सीमा परिवर्तन, बैच अपडेट ब्लॉक) के बाद स्क्रीन पर प्रत्येक आइटम के लिए बुलाया गया था, लेकिन दस्तावेज़ों को फिर से पढ़ने के बाद, यह उन वस्तुओं के लिए है जिन्हें एनिमेटिंग की आवश्यकता है। खुशी से हालांकि, मैं लेआउट स्विच करने के दौरान लेआउट को स्विच करते समय लेआउट को स्विच करते समय लगातार लेआउट स्विच कर रहा था 'लेआउट एट्रिब्यूट्सफोरइमेंट्स इनरक्ट:' लेआउट एट्रिब्यूट्सफॉरटैमएट इंडेक्सपैथ: ' –

+0

@ एसएम्पेज क्या आप मुझे चयनित कोशिकाओं के जेड-इंडेक्स के बारे में और बता सकते हैं? मैं जो कह रहा हूं उसके बारे में कहीं भी सबूत नहीं मिल रहा है, लेकिन मुझे अपने एनिमेशन में कुछ असंगतताएं दिखाई देती हैं ... धन्यवाद! –

10

मैं एक ही समस्या पड़ा है। लेआउट स्विच करने से सेल के लिए ज़िन्डेक्स को नजरअंदाज कर दिया जाएगा।

मैं इसे "सही लग रही" इस तरह z- अक्ष पर एक अनुवाद लगाने से बनाने में कामयाब रहे:

attributes.transform3D = CATransform3DMakeTranslation(0, 0, indexPath.row); 

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

+0

यदि आपका उत्तर वास्तविक समाधान नहीं है, तो मेरा सुझाव है कि आप इसे एक टिप्पणी के रूप में पोस्ट करें। –

+0

इसके बारे में क्षमा करें, मैं स्टैक ओवरफ़्लो शिष्टाचार से परिचित नहीं हूं। मुझे यकीन नहीं है कि कोई टिप्पणी कैसे पोस्ट करें, मुझे लगता है कि 'मैं एक और जवाब जोड़ सकता हूं'। – TheoB

+0

आप बिल्कुल सही हैं: [एक टिप्पणी जोड़ना] (http://stackoverflow.com/privileges/comment) को 50 प्रतिष्ठा स्कोर की आवश्यकता है। मैं तुम्हें धक्का देने का मतलब नहीं था। सहयोग करने के लिए स्वागत है। मेरी टिप्पणी एसओ तरीके से सहयोग करने का निमंत्रण है। :) –

8

मैं संयोजन ग्रिमफ्रॉग और चार्ली इलियट के प्रतिक्रियाओं का उपयोग कर व्यवहार कर रहा हूं।

चार्ली इलियट के समाधान को संग्रह दृश्य में वस्तुओं के लिए सही अंतिम परिणाम मिला लेकिन एनीमेशन के दौरान ज़िन्डेक्स पर अभी भी एक स्नैपिंग प्रभाव पड़ा।

grimfrog के समाधान ने सही रूप प्रदान किया लेकिन सही दिखने के बावजूद ज़िन्डेक्स अभी भी लेआउट परिवर्तन के बाद गलत होने की समस्या थी।

दो के संयोजन है, जबकि नहीं एक महान समाधान है, काम करता है और बदलने का समर्थन किया और UICollectionViewLayoutAttributes की zindex गुण

मेरी लेआउट में, मैं

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSArray *attributes = [super layoutAttributesForElementsInRect:rect]; 

    [attributes enumerateObjectsUsingBlock:^(UICollectionViewLayoutAttributes *attributes, NSUInteger idx, BOOL *stop) { 
    attributes.zIndex = attributes.indexPath.item + 1; 
    }]; 

    return attributes; 
} 

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewLayoutAttributes *attributes = [super layoutAttributesForItemAtIndexPath:indexPath]; 

    attributes.transform3D = CATransform3DMakeTranslation(0, 0, attributes.indexPath.item); 
    return attributes; 
} 

मैं जीता 'है का उपयोग करता है यह अभी तक सही उत्तर के रूप में नहीं बना है, क्योंकि मुझे यकीन है कि इसे हल करने का एक और तरीका होना चाहिए, लेकिन मुझे यह देखने में दिलचस्पी है कि यह दूसरों के लिए भी समस्या हल करता है या नहीं।

+0

यह मेरे लिए काम करता है, लेकिन मुझे यकीन नहीं है कि transform3D को layoutAttributesForItemAtIndexPath में क्यों सेट किया जाना है। यह काम नहीं करता है अगर यह केवल लेआउट में सेट है AttributesForElementsInRect। – honcheng

3

यह मुझे भी थोड़ा सा। कई परीक्षणों के बाद मुझे एहसास हुआ कि UICollectionView जेड-इंडेक्स के बावजूद चयनित कोशिकाओं को शीर्ष पर रखने के लिए मजबूर करेगा।

0

एक प्रारंभिक बिंदु के रूप @sampage & @grimfrog जवाब का उपयोग करना, मैं एक ऐसी ही काम कर

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)path 
{ 
    UICollectionViewLayoutAttributes* attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:path]; 
    attributes.zIndex = path.item; 
    attributes.transform3D = CATransform3DMakeTranslation(0, 0, path.item); 
    // other attribute settings 
    return attributes; 
} 

मेरे layoutAttributesForElementsInRect: कॉल layoutAttributesForItemAtIndexPath: जब विशेषता सरणी पैदा स्थिति प्राप्त करने में सक्षम था - तो मैं केवल zindex शामिल करने के लिए की जरूरत और वहाँ 3 डी ट्रांसफॉर्म।

6

प्रयास करें:

// In UICollectionViewCell subclass 
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes 
{ 
    [super applyLayoutAttributes:layoutAttributes]; 
    // Setting zPosition instead of relaying on 
    // UICollectionView zIndex management 'fixes' the issue 
    self.layer.zPosition = layoutAttributes.zIndex; 
} 
+0

एक आकर्षण काम करता है, धन्यवाद। –

0

मैं एक वैकल्पिक हल मिल गया। चूंकि सभी कोशिकाएं एक ही पर्यवेक्षण से संबंधित हैं, जब सेल प्रदर्शित करने पर काम करता है bringSubviewToFront :। विशेष रूप से, डीबग व्यू पदानुक्रम में देखकर, हालांकि UICollectionViewLayout zIndex के अनुसार कोशिकाओं को प्रस्तुत नहीं करता है, फिर भी यह कोशिकाओं को रिवर्स ऑर्डर के अनुसार दिखाता है कि प्रत्येक सबव्यू इसके सुपर व्यू में जोड़ा जा रहा है।

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