CollectionView sizeForItemAtIndexPath çağrılmadı


96

Bu beni deli ediyor! Aşağıda gösterildiği gibi bir UICollectionViewController'ım var:

class PhrasesCompactCollectionViewController: UICollectionViewController

NumberOfSections ve cellForItemAt çağrılıyor, ancak sizeForItemAtIndexPath hiçbir zaman çağrılmaz. Aynı kodu başka bir yerde kullanıyorum ve doğru şekilde ateşleniyor. Xcode 8 Beta 6 kullanıyorum.

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

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

Yanıtlar:


256

Protokolü UICollectionViewDelegateFlowLayoutsınıf bildiriminize uyguladığınızı belirtmeniz gerekir .

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout


13
Bunu yaptım ama hala aranmadı. :(
Van Du Tran

58

In Swift 3+ Kullanımı Bu yöntem:

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

Sınıfınızın her iki Delege ile uyumlu olduğundan emin olun

  • UICollectionViewDelegate

  • UICollectionViewDelegateFlowLayout


4
UICollectionViewDelegateUICollectionViewController'ın zaten yaptığı gibi uyum sağlamak gereksizdir .
Van Du Tran

3
Bu bir UICollectionViewController ... gerekmemektedir ediliyor çünkü 'gerekli durumuna yedekli değil @VanDuTran
Michael Hudson

Bir koleksiyon görünümü olmayan Viewcontroller'ın UICollectionViewDelegate olabileceğini kastettiğinizi düşünüyorum.
ScottyBlades

1
UICollectionViewDelegateFlowLayout, UICollectionViewDelegate öğesinden miras alır, bu nedenle UICollectionViewDelegateFlowLayout
evya

52

Ben de aynı sorunu yaşadım. Bana yardımcı olan tek şey, collectionView boyut denetçisi 'Yok' altında Hücre Boyutu için 'Tahmini Boyut' yapmaktı.

görüntü açıklamasını buraya girin


9
Günümü kurtardın dostum, sen bir kahramansın
Asif Ali

1
Her nasılsa, kullanımla ilgili diğer tüm gönderilerdeki diğer tüm cevaplar bundan sizeForItemAtbahsetmedi. Çok kullanışlı.
JCutting8

Bu çılgınca!!!! İPhone 5 simülatöründe 10.3.1 iOS sürümü ile test ettim ve yöntem çağrıldı. iPhone 5s simülatöründe 10.3.1 sürüm yöntemi ile aranmıyor !!! Tahmini Boyutu Yok olarak değiştirdim. İPhone 5'lerde aranmaya başladı. WT WT WT
hasan

Çok teşekkürler! Custom ile koleksiyon görünümüm sizeForItemAt, hücreler aniden yanlış genişliğe geldiğinde Xcode 11.4'e kadar iyi çalıştı. Bir çok şeyi denedim ve bu sonunda işe yaradı.
Filip

Zamanımı kurtardın. Çok teşekkürler.
Shahbaz Akram

17

Swift 5

Tüm bu adımlar gereklidir :

  1. Uygunluk UICollectionViewDelegateFlowLayout <== Kesinlikle gerekli !!
  2. ve UICollectionViewDelegate, UICollectionViewDataSource
  3. Bunları viewDidLoad'da ayarlayın: collectionView.delegate = selfvecollectionView.dataSource = self
  4. Arayüz Oluşturucu'da Tahmini Boyutu Yok olarak ayarlayın
  5. Aşağıdaki yöntemin sizeForItemAt'a sahip olduğundan ve sizeForItemAtIndexPath olmadığından emin olun

gibi :

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

4
Boyutu Yok Olarak Tahmin Et - günümü kurtar!
Joe Hallenbeck

15

Hızlı 3

UICollectionView Hücre Boyutunu ayarlamak için nesnesini oluşturmanız ve özelleştirmeniz gerekir UICollectionViewFlowLayout. Özellikleri özelleştirin ve bu düzen nesnesini UICollectionView nesnesine ayarlayın.

Hücre yüksekliği ve hücre genişliği nesnelerini ihtiyacınıza göre değiştirin (istediğiniz hücre yüksekliği ve genişliği).

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()
}

Emin Olun: sizeForItemAt indexPath yöntemini eklediyseniz, yöntemi KALDIRMALIDIR ...

Aşağıdaki Yöntemi Kaldır

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

}

12
Bu nasıl yardımcı olur?
almas

1
Almas, Bu, UICollectionViewCell'in özel hücre boyutunu ayarlamak için yararlı olacaktır ... Kendi değerlerinizi tanımlayabileceğiniz cellWidth ve cellHeight değişkenleri vardır ... "layout.sectionInset", "layout.minimumLineSpacing" ve "layout .minimumInteritemSpacing ", bu değişkenler UICollectionViewCell boyutu için de önemlidir ..
Gaurav Rami

2
Bu yalnızca tüm hücreler aynı boyuttaysa çalışır. Aşağıdaki cevap doğru cevaptır
JeffN

bu, UICollectionView boyutunu değiştirmek içindir, ancak görünümün içindeki hücreyi değiştirmez
Async

Bu, delege yönteminin neden çağrılmadığının cevabı değil
Ziv Kesten

6

Birinci sınıfın UICollectionViewDelegateFlowLayout için onaylanması gerekir. Daha sonra viewDidLoad () 'a aşağıdaki kodu yazmanız gerekir:

// UICollectionView'e UIViewController'ın UICollectionViewDelegateFlowLayout yöntemlerini kullanmasını söylemek için

collectionView.delegate = self

// Kendi koleksiyon görünümü akış düzeninizi ayarlamak istiyorsanız

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

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

Bu kodu kullanarak UICollectionViewDelegateFlowLayout yöntemi

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

çağrılacaksa, bu yöntemde boyutu ayarlayabilirsiniz.


5

Hiçbir yanıtın işe yaramadığını kontrol etmeniz gereken üç şey:

  1. FlowLayout Temsilcisini Uygulama: class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout

  2. Swift 3.0+ için öğe boyutu yöntemini kullanın: 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'un Inspect öğesinde seçin .


2

Aynı sorunu yaşadım ve hiçbir şey düzeltemezdi. Düzen Temsilcisi tarafından tanımlanan başka bir işleve yaklaştığı için bunu özel yapmamı söyleyen sarı bir uyarı aldım. Bunu benim için düzelten şey şuydu:

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

"SizeForItemAtIndexPath" ile doğru "sizeForItemAt" arasındaki farka dikkat edin.

Bunu anlamaya çalışırken günlerce saçımı yırttım ve sonunda işe yaradı. Aşağıda, yüksekliği 0'a eşit yaparak bir hücreyi nasıl "gizlediğimi" size göstermek için tüm işlevlerimi ekleyeceğim.

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)
    }
}

1

Bunu viewDidLoad () içine koyduğunuzdan emin olun

collectionView.delegate = self

1

Sadece şunu ekleyin: UICollectionViewDelegateFlowLayout

class YourClass: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {}

0

Dün gece bu sorunu yaşadım. Sonunda gece yarısı 'didSelectItemAtIndex' yönteminin bir kapatma ayracı ile kapatılmadığını fark ettiğimde çözdüm "}"

Derleme hatası tarafından sorulduğunda sınıfın en altına bir kapatma ayracı ekledim. Dolayısıyla, aslında 'didSelectItemAtIndex' altındaki tüm yöntemler bu yöntemin içindeydi.

Başkasının akşamlarının 4 saatini bu seferde boşa harcaması ihtimaline karşı burada yayınlamak :-(


0

benim sorunum UICollectionViewDataSource nesnemin yerel değişken olarak oluşturulmuş olmasıydı. Bu nedenle, dataSource nesnenizi kodda manuel olarak başlatırsanız, onu global değişken olarak sakladığınızdan emin olun.


0

Bu yöntemi kullanın

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

}

Onun yerine

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

}

-12

Benim için (Swift 3.1'de) yöntem şu şekilde açıklanmalıdır:

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

Herkese açık yapmayı unutma .


publickodunuzu çerçeveler ve modüller arasında erişilebilir kılmak için kullandığınız şeydir.
ScottyBlades
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.