संग्रह दृश्य आकारForItemAtIndexPath कभी नहीं कहा जाता है


92

यह मुझे पागल बना रहा है! मेरे पास एक UICollectionViewController है जैसा कि नीचे दिखाया गया है:

class PhrasesCompactCollectionViewController: UICollectionViewController

NumberOfSections और cellForItemAt कहा जा रहा है, लेकिन sizeForItemAtIndexPath कभी नहीं कहा जाता है। मैं कहीं और उसी सटीक कोड का उपयोग कर रहा हूं और यह सही ढंग से फायर करता है। मैं Xcode 8 बीटा 6 का उपयोग कर रहा हूं।

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

        return CGSize(width: 120, height:120) 
    }

जवाबों:


250

आपको यह निर्दिष्ट करने की आवश्यकता है कि आप UICollectionViewDelegateFlowLayoutअपनी कक्षा की घोषणा में प्रोटोकॉल को लागू करते हैं ।

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout


10
मैंने ऐसा किया लेकिन यह अभी भी नहीं कहा गया है। :(
वान डू ट्रान

57

में स्विफ्ट 3+ इस विधि का उपयोग करें:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width:(collectionView.frame.height-90)/2, height: 100)
}

सुनिश्चित करें कि आपकी कक्षा डेलीगेट का अनुपालन करती है

  • UICollectionViewDelegate

  • UICollectionViewDelegateFlowLayout


4
यह UICollectionViewDelegateपहले से ही UICollectionViewController के रूप में पालन ​​करने के लिए बेमानी है।
वान ड्यू ट्रान

2
@VanDuTran यह बताना अनावश्यक नहीं है कि यह आवश्यक है क्योंकि UICollectionViewController होने की आवश्यकता नहीं है ...
माइकल हडसन

मुझे लगता है कि आपका मतलब था कि एक गैर संग्रह दृश्य, व्यूकंट्रोलर UICollectionViewDelegate हो सकता है।
स्कॉट्टीब्लाड्स

1
UICollectionViewDelegateFlowLayout UICollectionViewDelegate से विरासत में मिला है, इसलिए केवल UICollectionViewDelegateFlowLayout को लागू करें
evya

43

मुझे भी यही समस्या थी। एक चीज जिसने मुझे मदद की, वह संग्रह आकार आकार निरीक्षक 'कोई नहीं' के तहत सेल आकार के लिए 'अनुमानित आकार' बनाने में थी।

यहां छवि विवरण दर्ज करें


8
आपने मेरा दिन बचा लिया, आप एक हीरो हैं
आसिफ अली

1
किसी भी तरह से अन्य सभी पोस्ट पर अन्य सभी उत्तर का उपयोग sizeForItemAtकरने के बारे में यह उल्लेख करने में विफल रहा। बहुत उपयोगी।
JCutting8

यह पागलपन है!!!! मैंने 10.3.1 iOS संस्करण के साथ iPhone 5 सिम्युलेटर पर परीक्षण किया और विधि को कॉल किया गया। 10.3.1 संस्करण विधि के साथ iPhone 5 एस सिम्युलेटर पर बुलाया नहीं जाता है !!! मैंने एस्टीमेट साइज को किसी में नहीं बदला। इसे iPhone 5s कहा जाने लगा। WT WT WT
हसन

आपका बहुत बहुत धन्यवाद! कस्टम के साथ मेरा संग्रह दृश्य sizeForItemAtXcode 11.4 तक अच्छी तरह से काम करता था जब अचानक कोशिकाओं की चौड़ाई गलत थी। चीजों का गुच्छा बनाया और अंत में यह काम किया।
फ़िलिप

आपने मेरा समय बचाया। बहुत बहुत धन्यवाद।
शहबाज अकरम

15

स्विफ्ट 3

UICollectionView का सेल साइज़ सेट करने के लिए, आपको ऑब्जेक्ट बनाने और कस्टमाइज़ करने की आवश्यकता है UICollectionViewFlowLayout। गुणों को अनुकूलित करें और उस लेआउट ऑब्जेक्ट को UICollectionView ऑब्जेक्ट पर सेट करें।

अपनी आवश्यकता (आप जिस सेल हाइट और चौड़ाई को चाहते हैं) के अनुसार सेलहाइट और सेल सेल वाइट ऑब्जेक्ट बदलें।

override func viewDidLoad() {
    super.viewDidLoad()

    let cellWidth : CGFloat = myCollectionView.frame.size.width / 4.0
    let cellheight : CGFloat = myCollectionView.frame.size.height - 2.0
    let cellSize = CGSize(width: cellWidth , height:cellheight)

    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical //.horizontal
    layout.itemSize = cellSize
    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    layout.minimumLineSpacing = 1.0
    layout.minimumInteritemSpacing = 1.0
    myCollectionView.setCollectionViewLayout(layout, animated: true)

    myCollectionView.reloadData()
}

सुनिश्चित करें: यदि आपने sizeForItemAt indexPath विधि जोड़ी है, तो विधि को फिर से तैयार करना होगा ...

नीचे की विधि निकालें

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

}

12
यह कैसे सहायक है?
अल्मास

1
अल्मास, यह UICollectionViewCell के कस्टम सेल आकार के लिए सहायक होगा ... इसमें चर सेलवाइट और सेलहाइट होते हैं, जिसमें आप अपने स्वयं के मूल्यों को परिभाषित कर सकते हैं ... साथ ही "लेआउट.सेंक्शन इनसेट", "लेआउट.मिनटिमलाइन्स्पेसिंग" और "लेआउट" .minimumInteritemSpacing ", ये चर UICollectionViewCell आकार के लिए भी मायने रखते हैं ..
गौरव रामी

2
यह केवल तभी काम करता है जब सभी कोशिकाएं समान आकार की हों। नीचे दिया गया उत्तर सही उत्तर है
जेएफएन

यह UICollectionView के आकार को बदलने के लिए है, लेकिन दृश्य के अंदर कोशिका नहीं है
Async-

यह इस बात का जवाब नहीं है कि प्रतिनिधि पद्धति को क्यों नहीं कहा जाता है
Ziv Kesten

10

स्विफ्ट 5

इन सभी चरणों की आवश्यकता है :

  1. UICollectionViewDelegateFlowLayout के अनुरूप <== बिल्कुल ज़रूरत है !!
  2. और करने के लिए UICollectionViewDelegate, UICollectionViewDataSource
  3. इन्हें व्यूडीडलड में सेट करें: collectionView.delegate = selfऔरcollectionView.dataSource = self
  4. इंटरफ़ेस बिल्डर में कोई भी करने के लिए अनुमानित आकार सेट करें
  5. सुनिश्चित करें कि निम्न विधि का आकार हैफॉरइमेट और नहीं ForItemAtIndexPath है

जैसा :

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
    return CGSize(width: 100, height:100)
} 

1
किसी को भी आकार का अनुमान नहीं है - मेरा दिन बचाओ!
जो हालेंबेक

6

प्रथम श्रेणी को UICollectionViewDelegateFlowLayout की पुष्टि करनी होगी। फिर आपको viewDidLoad () में निम्नलिखित कोड लिखना होगा:

// अपने UIViewController के UICollectionViewDelegateFlowLayout तरीकों का उपयोग करने के लिए UICollectionView को बताएं

collectionView.delegate = self

// अगर आप अपना कलेक्शन व्यू फ्लो लेआउट सेट करना चाहते हैं

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //depending upon direction of collection view

self.collectionView?.setCollectionViewLayout(layout, animated: true)

इस कोड का उपयोग करके UICollectionViewDelegateFlowLayout विधि

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize

कहा जाता है, आप इस विधि में आकार सेट कर सकते हैं।


4

यदि कोई उत्तर काम नहीं करता है, तो आपको तीन चीजों की जांच करने की आवश्यकता है:

  1. फ्लोयलेट प्रतिनिधि लागू करें: class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout

  2. तेजी से 3.0+ के लिए आइटम के आकार के लिए विधि का उपयोग करें: func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (collectionView.frame.width / 3) - 1, height: collectionView.frame.width) }

  3. Estimate size = NoneUICollectionView के निरीक्षण तत्व में चयन करें ।


2

मुझे भी यही समस्या थी और कुछ भी ठीक नहीं होगा। मैंने इसे निजी बनाने के लिए एक पीली चेतावनी दी थी क्योंकि यह लेआउट डेलिगेट द्वारा परिभाषित एक अन्य फ़ंक्शन के करीब आया था। मेरे लिए यह तय था:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize

"SizeForItemAtIndexPath" से अंतर को सही "sizeForItemAt" पर ध्यान दें।

मैंने अपने बालों को दिन के लिए उखाड़ फेंका और यह पता लगाने की कोशिश कर रहा था कि आखिरकार यह काम कर गया। नीचे मैं आपको दिखाने के लिए अपने सभी फ़ंक्शन को शामिल करूंगा कि कैसे मैं 0 के बराबर ऊँचाई बनाकर एक सेल को "छुपा" सकता हूं।

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let findIndex = labelArray.index(of: "\(labelArray[indexPath.row])")
    let screenSize = UIScreen.main.bounds
    let screenWidth = screenSize.width

    if (findIndex! % 2 == 0){
        // Even index, show cell
        return CGSize(width: screenWidth, height: 246)
    }
    else {
        return CGSize(width: screenWidth, height: 0)
    }
}

0

मेरे पास यह मुद्दा कल रात था। आखिरकार इसे आधी रात को हल कर दिया जब मुझे एहसास हुआ कि 'didSelectItemAtIndex' विधि एक बंद ब्रैकेट के साथ बंद नहीं हुई थी "}"

मैंने संकलन त्रुटि द्वारा पूछे जाने पर कक्षा के बहुत नीचे एक बंद कोष्ठक जोड़ा। इसलिए प्रभावी रूप से 'didSelectItemAtIndex' के नीचे के सभी तरीके उस पद्धति के अंदर थे।

इस मामले में किसी और के यहां शाम के 4 घंटे बर्बाद करने पर यहाँ पोस्टिंग: --(


0

सुनिश्चित करें कि आपने इसे viewDidLoad में डाला है ()

collectionView.delegate = self

0

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


0

इस विधि का उपयोग करें

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

}

के बजाय

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

}

-11

मेरे लिए (स्विफ्ट 3.1 में) विधि को इस तरह सार्वजनिक घोषित किया जाना चाहिए:

    public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
       return CGSize()
    }

इसे सार्वजनिक करने के लिए मत भूलना ।


publicवह है जो आप अपने कोड को फ्रेमवर्क और मॉड्यूल के बीच सुलभ बनाने के लिए उपयोग करते हैं।
स्कॉट्टीब्लाड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.