2013-11-22 8 views
9

मेरे पास एक संग्रह दृश्य है, और मैं उस प्रभाव के लिए जा रहा हूं जहां एक सेल टैप किया जाता है, यह पूरी स्क्रीन को उठाने के लिए बढ़ता है। इसे पूरा करने के लिए, मैं अनिवार्य रूप से performBatchUpdates को didSelectItemAtIndexPath के अंदर बुला रहा हूं, और sizeForItemAtIndexPath किसी चयनित सेल के लिए एक बड़ा आकार वापस करने के बारे में जानता है। यह सब बहुत अच्छी तरह से काम करता है, सेल वांछित के रूप में बढ़ता है और shrinks।मैं अपने आकार को बदलने के दौरान संग्रह दृश्य कक्ष के आंतरिक दृश्यों को कैसे एनिमेट कर सकता हूं?

समस्या सेल के अंदर है। संग्रह दृश्य कक्ष बाधाओं द्वारा प्रबंधित एक मामूली जटिल दृश्य पदानुक्रम से बना है। मैं सेल के उप दृश्यों को एनिमेटिंग सेल के साथ बढ़ने और घटाने के लिए चाहता हूं। दुर्भाग्यवश, मेरे सबव्यूज़ तुरंत अपनी नई स्थिति में स्नैप कर रहे हैं क्योंकि सेल धीरे-धीरे अपने नए आकार में एनिमेट करता है। सेल सेल के साथ एनिमेट की सेल की सामग्री कैसे सुनिश्चित कर सकता हूं?

- (CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
if ([collectionView.indexPathsForSelectedItems containsObject:indexPath]) 
    return CGSizeMake(collectionView.bounds.size.width - 20, collectionView.bounds.size.height - (20 + [self.topLayoutGuide length])); 
else 
    return CGSizeMake(260, 100); 
} 

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    [collectionView performBatchUpdates:nil completion:nil]; 
} 
+1

आपके सबव्यूस सबसे अधिक संभावना में स्नैप कर रहे हैं क्योंकि कुछ ध्वज जो सेल को विस्तारित करते हैं, झूठ से सच में स्विच किए जाते हैं, और फिर 'लेआउटस्यूब्यूव्यू' को बुलाया जाता है, जो तुरंत उप-दृश्यों को उनके विस्तारित पदों पर ले जाता है। मैं बस अनुमान लगा रहा हूं - अगर आप कोड जोड़ते हैं तो हम यह देखने में सक्षम होंगे कि क्या यह मामला है। एक और नोट पर - क्या सेल संग्रह में अन्य कोशिकाओं के शीर्ष पर विस्तारित होना चाहिए, या इसे रास्ते से बाहर धक्का देना चाहिए? यदि इसे शीर्ष पर विस्तार करना चाहिए, तो मैं UICollectionView के ऊपर एक नया दृश्य जोड़ने और उसे एनिमेट करने की अनुशंसा करता हूं। – Ian

+0

मैंने दो प्रासंगिक विधियों को जोड़ा जो चयन पर आकार बदलते हैं। दृश्य नियंत्रक में बहुत कम कोड है। सेल स्वयं कुछ निब फाइलें हैं, कुछ भी नहीं जो मैं आसानी से पोस्ट में जोड़ सकता हूं। – Mike

उत्तर

11

मैं बिल्कुल वैसा ही समस्या थी:

यहाँ संग्रह दृश्य नियंत्रक से दो प्रासंगिक तरीके हैं। कई प्रयासों के बाद, निम्नलिखित कोड ने मेरे लिए चाल बनाई। 3.0 (+ - बैचअपडेट अवधि) की अवधि के साथ बैच अपडेट के बाद सीधे कॉलिंग लेआउट IfNeed बाधाओं को एनिमेटेड करता है।

[self performBatchUpdates:nil completion:nil]; 

// IndexPath of cell to be expanded 
UICollectionViewCell *cell = [self cellForItemAtIndexPath:indexPath]; 
[UIView animateWithDuration:0.3 animations:^{ 
    [cell.contentView layoutIfNeeded]; 
}]; 
+0

धन्यवाद आपने मुझे पागल होने से बचाया। – logancautrell

+0

हाँ, यह काम करता है, मैंने इसे एक ही समस्या का हल किया – Sherlock

2

मैं एंटोनी के उत्तर पर विस्तार करना चाहता हूं। एनीमेशन ब्लॉक के अंदर performBatchUpdates:completion: पर कॉल करने से वास्तव में सेल आकार बदलने की अवधि निर्धारित हो जाएगी और सामग्री का आकार बदल जाएगा।

[UIView animateWithDuration:0.3 animations:^{ 
    [self performBatchUpdates:^{ 
     // set flags needed for new cell size calculation 
    } completion:nil]; 
    [collectionView layoutIfNeeded]; 
}]; 

इस तरह आप एनीमेशन समय के साथ भी खेल सकते हैं या वसंत एनिमेशन का भी उपयोग कर सकते हैं।

0

मुझे एक ही समस्या है। इन्हें CollectionViewCell के अपने उप-वर्ग में जोड़ें। इससे मेरा काम बनता है।

// ProblematicCollectionViewCell.swift 

override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) { 
    super.apply(layoutAttributes) 
    layoutIfNeeded() 
} 

यहाँ origanl लिंक है: https://codedump.io/share/LXZwAOOMxafU/1/uicollectionviewcell---contents-do-not-animate-alongside-cell39s-contentview जवाब टिप्पणियों में है।

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

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