2012-12-06 17 views
40

मेरी UICollectionView कोशिकाओं में मल्टीलाइन टेक्स्ट के साथ UILabels शामिल हैं। के height को UILabel पर पाठ सेट होने तक मुझे नहीं पता। थाउनके डेटा को सेट करने के बाद UICollectionView कक्षों का आकार बदलें

-(CGSize)collectionView:(UICollectionView *)collectionView 
       layout:(UICollectionViewLayout*)collectionViewLayout 
sizeForItemAtIndexPath:(NSIndexPath *)indexPath; 

प्रारंभिक विधि मैं आकार UICollectionViewCells करने को देखा है, लेकिन इस से पहले कोशिकाओं UIStoryboard से बाहर बनाई गई हैं कहा जाता है। संग्रह के बाद कोशिकाओं को संग्रहित करने और आकार को ले जाने का कोई तरीका है, और मुझे सेल का वास्तविक आकार पता है?

+0

में दुर्घटना की ओर जाता है यह इस समस्या का सबसे अच्छा समाधान जैसा दिखता है - http: // stackoverflow।कॉम/ए/1 918480/2147976 – codeburn

उत्तर

65

मुझे लगता है कि अपने invalidateLayout विधि आप अपने UICollectionView की .collectionViewLayout संपत्ति पर कॉल कर सकते हैं के लिए देख रहे हैं। यह विधि आपके लेआउट को पुन: उत्पन्न करती है, जो आपके मामले में -collectionView: layout: sizeForItemAtIndexPath: को भी कॉल करती है, जो आपके इच्छित आइटम आकार को दर्शाने के लिए सही जगह है। जीर्यून उनकी गणना करने के तरीके पर सही दिशा बताते हैं।

invalidateLayout के उपयोग के लिए एक उदाहरण here पाया जा सकता है। उस विधि पर UICollectionViewLayout दस्तावेज़ों से परामर्श लें:

वर्तमान लेआउट को अमान्य करता है और एक लेआउट अद्यतन ट्रिगर करता है।

चर्चा:

आप लेआउट जानकारी अद्यतन करने के लिए किसी भी समय इस विधि कॉल कर सकते हैं। यह विधि स्वयं संग्रह संग्रह के लेआउट को अमान्य करती है और तुरंत लौटती है। इस प्रकार, आप कई लेआउट अपडेट ट्रिगर किए बिना कोड के उसी ब्लॉक से कई बार इस विधि को कॉल कर सकते हैं। वास्तविक लेआउट अद्यतन अगले दृश्य लेआउट अद्यतन चक्र के दौरान होता है।

संपादित करें:

स्टोरीबोर्ड संग्रह दृश्य जो ऑटो लेआउट की कमी है, तो आपको UIViewController की viewDidLayoutSubviews विधि ओवरराइड और इस विधि में invalidateLayout संग्रह व्यू लेआउट कॉल करने की आवश्यकता के लिए।

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    [yourCollectionView.collectionViewLayout invalidateLayout]; 
} 
+0

मैं आपके कार्यान्वयन दृष्टिकोण का पालन कर रहा हूं, एक समस्या है जो मैंने मुलाकात की: 'अवैध करें' कॉल करने के बाद कभी-कभी कोशिकाएं गायब हो जाती हैं/अदृश्य हो जाती हैं, इसलिए मैं उन्हें 'cellForItemAtIndexPath' के साथ' sizeForItemAtIndexPath' में नहीं प्राप्त कर सकता। बीटीडब्ल्यू मैं अपने आकार प्राप्त करने के लिए कोशिकाओं का उपयोग करता हूं, मेरे पास इसके लिए एक अलग स्टोर नहीं है। –

+0

ठंडा थाक्स! डेटा रीलोड – Raegtime

+0

से बहुत बेहतर है! सेल चौड़ाई पर फंस गया था जो ऑटो लेआउट द्वारा असाइन नहीं किया गया था, लेकिन इस समाधान को पढ़ने के बाद मैंने इसे समझ लिया। पीएस मैंने ऑटो लेआउट मुद्दे के लिए कोड डाला, आशा है कि आप दिमाग में नहीं हैं। – Kampai

4
ऊपर delegate विधि अपने आप में

अरे, आप नीचे दिए गए मुश्किल रास्ता का उपयोग कर UILabel आकार की गणना और UICollectionViewCellsize कि गणना के आधार पर लौट सकते हैं।

// Calculate the expected size based on the font and 
    // linebreak mode of your label 
    CGSize maximumLabelSize = CGSizeMake(9999,9999); 

    CGSize expectedLabelSize = 
    [[self.dataSource objectAtIndex:indexPath.item] 
      sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f] 
     constrainedToSize:maximumLabelSize 
      lineBreakMode:NSLineBreakByWordWrapping]; 
3

उपवर्ग UICollectionViewCell और layoutSubviews इस

तरह ओवरराइड इसके द्वारा आप होगा लंगर सेल प्रमुख और collectionView

override func layoutSubviews() { 
     super.layoutSubviews() 

     self.frame = CGRectMake(0, self.frame.origin.y, self.superview!.frame.size.width, self.frame.size.height) 
    } 
0
- (void)viewDidLoad { 
    self.collectionView.prefetchingEnabled = NO; 
} 

को बढ़त अनुगामी आईओएस 10, prefetchingEnabled में YES डिफ़ॉल्ट रूप से है । जब YES, संग्रह दृश्य तब प्रदर्शित होता है जब वे प्रदर्शित किए जाएंगे। यह आईओएस 10

+1

जबकि इस कोड स्निपेट का स्वागत है, और कुछ मदद प्रदान कर सकता है, यह [अगर मेटा.स्टैकएक्स एक्सचेंज /q/114762) * में * और * क्यों * यह हल करता है तो यह बहुत बेहतर होगा [ मुसीबत। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न केवल उस व्यक्ति से पूछ रहे हैं! स्पष्टीकरण जोड़ने के लिए कृपया अपना उत्तर संपादित करें, और संकेत दें कि कौन सी सीमाएं और धारणाएं लागू होती हैं। –

+0

@TobySpeight आईओएस 10 में, prefetchingEnabled डिफ़ॉल्ट रूप से हाँ है। जब हाँ, संग्रह दृश्य तब प्रदर्शित होता है जब वे प्रदर्शित किए जाएंगे। यह आईओएस 10 –

+0

में दुर्घटना की ओर जाता है जो एक अच्छी व्याख्या की तरह दिखता है - कृपया ** इसे संपादित करने के लिए ** अपना उत्तर दें। धन्यवाद! –