2012-10-21 24 views
6

मैं एक यूआईसीओलेक्शन व्यू में कई छवि कोशिकाओं को प्रदर्शित कर रहा हूं। एक बटन के साथ मैं पहले अपने सभी सेल को समूह में सक्षम करने में सक्षम होना चाहता हूं।यूआईसीओलेक्शन व्यू: एनीमेशन कस्टम लेआउट

यह अच्छी तरह से काम कर रहा है लेकिन जब मैं अपने पुनर्गठन कार्रवाई में एनीमेशन संक्रमण जोड़ने की कोशिश कर रहा हूं, तो कुछ नहीं होता है।

यहाँ विधि मैं एक कस्टम लेआउट में उपयोग करें:

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

    if([allAttributesInRect count] > 0 && _isRegroup) 
    { 
     UICollectionViewLayoutAttributes *firstAttribute = [allAttributesInRect objectAtIndex:0]; 
     CGRect frame = firstAttribute.frame; 

     for(UICollectionViewLayoutAttributes *attribute in allAttributesInRect) 
      [UIView animateWithDuration:0.3f animations:^{attribute.frame = frame;}]; 
    } 
    return allAttributesInRect; 
} 

- (void)regroupCells:(BOOL)isRegroup // This method is called from my collection controller when my button is pressed 
{ 
    _isRegroup = isRegroup; 
    [self invalidateLayout]; 
} 

किसी भी विचार? धन्यवाद!

उत्तर

21

एनिमेशन उन तरीकों से काम नहीं करेगा जिन्हें आप उन्हें बुला रहे हैं।

लेआउट और एनिमेट को नए में बदलने के लिए, सबसे आसान तरीका है प्रत्येक संग्रह पैरामीटर के लिए nil के साथ अपने संग्रह दृश्य पर performBatchUpdates पर कॉल करना। यह आपके लेआउट को अमान्य करता है और आपके लिए नए को एनिमेट करता है।

ऐसा करने से पहले, आप लेआउट ऑब्जेक्ट को बताएंगे कि आप नया लेआउट होना चाहते हैं। इसके अलावा, layoutAttributesForElementsInRect के अंदर, बस अपने बूलियन वैरिएबल की जांच करें और समूह के फ्रेम को लागू करें (शायद केंद्र बेहतर होगा) जैसा कि आप अभी कर रहे हैं, लेकिन एनीमेशन के बिना। आपको layoutAttributesForElementAtIndexPath में इस कोड को पुन: पेश करने की भी आवश्यकता होगी।

तो, सारांश में:

  1. कि वह कहाँ है
  2. कि वे कहाँ हैं से एनीमेशन कॉल निकालें से अपने अमान्य लेआउट कॉल निकालें, बस लेआउट विशेषताओं
  3. रूप ..forElementAtIndexPath कोड जोड़ें में संशोधन अच्छी तरह से
  4. अपने दृश्य नियंत्रक में, लेआउट ऑब्जेक्ट पर regroup विधि को कॉल करें, फिर संग्रह दृश्य पर प्रदर्शन बैचअपडेट्स को कॉल करें।
+0

धन्यवाद! मैं समझता हूं कि यह अब कैसे काम करता है :) – Pierre

+0

यहां उन लोगों के लिए परिणाम है जो देखना चाहते हैं :) http://d.pr/v/QUTF (मुझे एक गड़बड़ समस्या है) – Pierre

+0

आपको "शीर्ष" के लिए जेड इंडेक्स बढ़ाने की जरूरत है "स्टैक में आइटम, आप फ्रेम को एडजस्ट करते समय उसी स्थान पर कर सकते हैं। – jrturton

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