2013-01-24 15 views
52

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

उत्तर

151

स्टोरीबोर्ड संपादक में सेल का आकार केवल सेल को डिज़ाइन करने में आपकी सहायता करने के लिए है। चूंकि प्रत्येक प्रोटोटाइप सेल एक अलग आकार हो सकता है, इसलिए UICollectionView नहीं जानता कि सभी कक्षों के लिए कौन से सेल का आकार चुनना है। यही कारण है कि आप वास्तविक आकार को सेट करते हैं जिसे आप अलग-अलग कोशिकाओं के लिए अलग-अलग उपयोग करना चाहते हैं। आप "संग्रह दृश्य आकार" शीर्षक के तहत, संग्रह दृश्य का चयन करके और आकार निरीक्षक में अपने सेल आकार चौड़ाई और ऊंचाई को सेट करके डिज़ाइनर में ऐसा कर सकते हैं।

या, आप निम्न विधि को ओवरराइड कर सकते हैं और एक CGSize ऑब्जेक्ट वापस कर सकते हैं जो उस आकार को निर्दिष्ट करता है जिसे आप प्रत्येक सेल के लिए उपयोग करना चाहते हैं।

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

उदाहरण::

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    return CGSizeMake(100, 100); 
} 

आपका दृश्य नियंत्रक इस विधि के नाम से जाना जाने के लिए, UICollectionViewDelegateFlowLayout के एक प्रतिनिधि होने की जरूरत है इस विधि का उपयोग करना, आप वास्तव में प्रत्येक कक्ष के लिए एक अलग आकार के होने हो सकता है। करने के लिए UICollectionView के सेल आकार गुण

@interface MyViewController() <UICollectionViewDelegateFlowLayout> 
+0

मैं एक कस्टम drawRect उपयोग कर रहा था मेरी uicollectionview सेल में ढाल परतों, UILabel, और UIImage जोड़ने के लिए है और यह मेरी uicollection ध्यान में रखते हुए सही आकार में ड्राइंग नहीं किया गया। इस कोड को मेरे मुख्य दृश्य नियंत्रक में डालकर समस्या को हल किया गया। – MGM

+1

यदि सभी कक्ष एक ही आकार के हैं, तो आकार निर्दिष्ट करने का एक अधिक प्रभावी तरीका यह है कि इसे 'UICollectionViewFlowLayout' में सेट करना है। जैसे 'flow.itemSize = CGSizeMake (50,100);' –

+1

लेकिन क्या '-collectionView: लेआउट: sizeForItemAtIndexPath:' विधि से प्रोग्रामेटिक रूप से प्रोटोटाइप सेल तक पहुंचने का कोई तरीका है? (एक पुन: उपयोग पहचानकर्ता का उपयोग कर सेल को डीक्यूइंग करना काम नहीं करता है, क्योंकि यह आकार बदलने की विधि को कॉल करता है, जिसके परिणामस्वरूप अनंत लूप होता है।) – erikprice

0

अपने सभी कोशिकाओं में एक ही आकार के होते हैं, तो आप बस स्थापित करना चाहिए: तो इस तरह के रूप में अपने दृश्य नियंत्रक के ज फाइल करने के लिए है कि प्रतिनिधि घोषणा को जोड़ने के लिए, मत भूलना UICollectionViewCell के आकार के गुणों के समान।

17

सभी कोशिकाओं में एक ही आकार के होते हैं और आप UICollectionViewFlowLayout

उदाहरण पर itemSize सेट कर सकते हैं:

((UICollectionViewFlowLayout *) self.collectionViewLayout).itemSize = CGSizeMake(100, 100); 
+2

संग्रह लगता है ViewLayout.itemSize IOS6 में उपलब्ध नहीं है – Sam

0

आप UICollectionView गुण में UICollectionViewCell का आकार सेट कर सकते हैं।

स्टोरीबोर्ड में, Collection ViewDocument Outline पर चुनें, फिर में अपने Cell Size संपादित करें।

और यदि आप कस्टम हैं तो आपको सेल के आकार का प्रकार डिफ़ॉल्ट में बदलना चाहिए।

4

स्विफ्ट, नवीनतम आईओएस के लिए काम कर रहा है।

(collectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = cellSize 

मैं सैम के लिए उत्तर करने के लिए पर्याप्त अंक नहीं हैं, लेकिन महत्वपूर्ण यह है कि यह UICollectionViewLayout लेकिन UICollectionViewFlowLayout नहीं है।

1

स्विफ्ट में आप प्रत्येक सेल के आकार को सेट करने के लिए sizeForItemAtIndexPath प्रतिनिधि विधि को कॉल कर सकते हैं।

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

     if indexPath.row == 0 { 
       // Set the size for cell no. 0 
     }else if indexPath.row == 1 { 
       // Set the size for cell no. 1 
     } 
    } 

मुझे उम्मीद है कि इससे मदद मिलती है। धन्यवाद!

0

अपने डिफ़ॉल्ट प्रतिनिधि का उपयोग करें। । ।

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize mElementSize; 
    mElementSize = CGSizeMake(SCREEN_WIDTH , SCREEN_HEIGHT *0.60); 
    return mElementSize; 
} 
संबंधित मुद्दे