Üstbilgi ve altbilgiyi hızlı bir şekilde koleksiyon görünümünde yapma

Hızlıca üstbilgi ve altbilgi toplama görünümünde nasıl yapılır?

Bir üstbilgi ve altbilgiyi bir araya getirmeye çalışıyorum ama çökmeye devam ediyor, anlayabilmek için hızlı bir eğitim bulamadım.

Sadece ikisine de nasıl ek görünüm getireceğimi bilemiyorum.

İkisini de film şeridinde (sınıf + tanımlayıcı) ayarladım

 override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    //#warning Incomplete method implementation -- Return the number of sections
    return 2
}


override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    //#warning Incomplete method implementation -- Return the number of items in the section
    return 10
}




override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
    var header: headerCell!
    var footer: footerCell!



    if kind == UICollectionElementKindSectionHeader {
        header =
            collectionView.dequeueReusableSupplementaryViewOfKind(kind,
                withReuseIdentifier: "header", forIndexPath: indexPath)
            as? headerCell

}
    return header

}

Hata:   UICollectionElementKindCell, tanımlayıcı bir ile - tanımlayıcı için bir uç ya da bir sınıf kaydetmeli ya da bir storyboard'a prototip hücre bağlamalı

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> profileCC {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("one", forIndexPath: indexPath) as! profileCC

   //Configure the cell

    return cell
}



override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

    switch kind {

    case UICollectionElementKindSectionHeader:

        let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "header", forIndexPath: indexPath) as! headerCell

        headerView.backgroundColor = UIColor.blueColor();
        return headerView

    case UICollectionElementKindSectionFooter:
        let footerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "footer", forIndexPath: indexPath) as! footerCell

        footerView.backgroundColor = UIColor.greenColor();
        return footerView

    default:

        assert(false, "Unexpected element kind")
    }
}

Umarım birileri yardım eder.

22
Lütfen çökme hakkında daha fazla bilgi verin
katma yazar Victor Sigler, kaynak
@ marrios Özel başlığınız ve altbilginiz için kodda veya Interface Builder'da bir sınıf kaydettiniz mi?
katma yazar Victor Sigler, kaynak
@ marrios Özel başlığınız ve altbilginiz için kodda veya Interface Builder'da bir sınıf kaydettiniz mi?
katma yazar Victor Sigler, kaynak
Özel bir üstbilgi veya altbilgi için bir sınıfın kodda nasıl kaydedileceğini görmek için güncellenmiş cevaba bakın.
katma yazar Victor Sigler, kaynak
Özel bir üstbilgi veya altbilgi için bir sınıfın kodda nasıl kaydedileceğini görmek için güncellenmiş cevaba bakın.
katma yazar Victor Sigler, kaynak
UICollectionElementKindCell, tanımlayıcı bir ile - tanımlayıcı için bir uç ya da bir sınıf kaydetmeli ya da bir storyboard'a prototip hücre bağlamalıdır '
katma yazar marrioa, kaynak
tanımlayıcı altbilgi UICollectionReusableView alt hücresi ve tanımlayıcı üstbilgi UICollectionReusableView üstbilgisi
katma yazar marrioa, kaynak
tanımlayıcı altbilgi UICollectionReusableView alt hücresi ve tanımlayıcı üstbilgi UICollectionReusableView üstbilgisi
katma yazar marrioa, kaynak

8 cevap

UICollectionView 'ı işlemek için bir UICollectionViewController yapabilirsiniz ve Interface Builder'da Altbilgi ve Başlık bölümlerini etkinleştirin, ardından UICollectionView 'da önizleme yapmak için aşağıdaki iki yöntemi kullanabilirsiniz:

override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

    switch kind {

    case UICollectionElementKindSectionHeader:

        let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "Header", forIndexPath: indexPath) as! UICollectionReusableView

        headerView.backgroundColor = UIColor.blueColor();
        return headerView

    case UICollectionElementKindSectionFooter:
        let footerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "Footer", forIndexPath: indexPath) as! UICollectionReusableView

        footerView.backgroundColor = UIColor.greenColor();
        return footerView

    default:

        assert(false, "Unexpected element kind")
    }
}

Yukarıdaki kodda, altbilgi ve başlık için tanımlayıcı 'yu Üstbilgi ve Altbilgi olarak koyuyorum, örneğin istediğiniz gibi yapabilirsiniz. Özel bir başlık veya altbilgi oluşturmak istiyorsanız, her biri için UICollectionReusableView alt sınıfı oluşturmanız ve istediğiniz şekilde özelleştirmeniz gerekir.

Özel altbilgi ve başlık sınıflarınızı Interface Builder'a veya aşağıdaki şekilde kodlara kaydedebilirsiniz:

registerClass(myFooterViewClass, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "myFooterView")
50
katma
Paylaşmak için örnek bir uygulamanız var mı?
katma yazar Learn2Code, kaynak

UICollectionView 'ı işlemek için bir UICollectionViewController yapabilirsiniz ve Interface Builder'da Altbilgi ve Başlık bölümlerini etkinleştirin, ardından UICollectionView 'da önizleme yapmak için aşağıdaki iki yöntemi kullanabilirsiniz:

override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

    switch kind {

    case UICollectionElementKindSectionHeader:

        let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "Header", forIndexPath: indexPath) as! UICollectionReusableView

        headerView.backgroundColor = UIColor.blueColor();
        return headerView

    case UICollectionElementKindSectionFooter:
        let footerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "Footer", forIndexPath: indexPath) as! UICollectionReusableView

        footerView.backgroundColor = UIColor.greenColor();
        return footerView

    default:

        assert(false, "Unexpected element kind")
    }
}

Yukarıdaki kodda, altbilgi ve başlık için tanımlayıcı 'yu Üstbilgi ve Altbilgi olarak koyuyorum, örneğin istediğiniz gibi yapabilirsiniz. Özel bir başlık veya altbilgi oluşturmak istiyorsanız, her biri için UICollectionReusableView alt sınıfı oluşturmanız ve istediğiniz şekilde özelleştirmeniz gerekir.

Özel altbilgi ve başlık sınıflarınızı Interface Builder'a veya aşağıdaki şekilde kodlara kaydedebilirsiniz:

registerClass(myFooterViewClass, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "myFooterView")
50
katma
Paylaşmak için örnek bir uygulamanız var mı?
katma yazar Learn2Code, kaynak

Swift 3.0 için güncellendi

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    switch kind {

    case UICollectionElementKindSectionHeader:

        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Header", for: indexPath)

        headerView.backgroundColor = UIColor.blue
        return headerView

    case UICollectionElementKindSectionFooter:
        let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Footer", for: indexPath)

        footerView.backgroundColor = UIColor.green
        return footerView

    default:
        assert(false, "Unexpected element kind")
    }
}

Ve:

self.collectionView.register(MyClass.self, forCellWithReuseIdentifier: "MyClass")
6
katma

Swift 3.0 için güncellendi

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    switch kind {

    case UICollectionElementKindSectionHeader:

        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Header", for: indexPath)

        headerView.backgroundColor = UIColor.blue
        return headerView

    case UICollectionElementKindSectionFooter:
        let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Footer", for: indexPath)

        footerView.backgroundColor = UIColor.green
        return footerView

    default:
        assert(false, "Unexpected element kind")
    }
}

Ve:

self.collectionView.register(MyClass.self, forCellWithReuseIdentifier: "MyClass")
6
katma

Kalan cevapları tamamlamak için, başlık/alt bilgi görünümlerinize yer ayırmayı unutmayın, aksi takdirde collectionView: viewForSupplementaryElementOfKind: atIndexPath çağrılmayacak .

Bunu, collectionView veri kaynağınıza collectionView: layout: referenceSizeForHeaderInSection uygulayarak yapın.

3
katma

Kalan cevapları tamamlamak için, başlık/alt bilgi görünümlerinize yer ayırmayı unutmayın, aksi takdirde collectionView: viewForSupplementaryElementOfKind: atIndexPath çağrılmayacak .

Bunu, collectionView veri kaynağınıza collectionView: layout: referenceSizeForHeaderInSection uygulayarak yapın.

3
katma

Çözüm

class CustomFlowLayout: UICollectionViewFlowLayout {

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributesForElementsInRect = super.layoutAttributesForElements(in: rect)
        var newAttributesForElementsInRect = [UICollectionViewLayoutAttributes]()

        for attributes in attributesForElementsInRect! {

            if !(attributes.representedElementKind == UICollectionElementKindSectionHeader
                || attributes.representedElementKind == UICollectionElementKindSectionFooter) {

               //cells will be customise here, but Header and Footer will have layout without changes.
            }

            newAttributesForElementsInRect.append(attributes)
        }

        return newAttributesForElementsInRect
    }
}


class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let headerNib = UINib.init(nibName: "HeaderCell", bundle: nil)
        collectionView.register(headerNib, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "HeaderCell")

        let footerNib = UINib.init(nibName: "FooterCell", bundle: nil)
        collectionView.register(footerNib, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "FooterCell")
    }


    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

        switch kind {
        case UICollectionElementKindSectionHeader:
            let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderCell", for: indexPath) as! HeaderCell
            return headerView
        case UICollectionElementKindSectionFooter:
            let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "FooterCell", for: indexPath) as! FooterCell
            return footerView
        default:
            return UICollectionReusableView()
        }
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        return CGSize(width: collectionView.frame.width, height: 45)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
        return CGSize(width: collectionView.frame.width, height: 25)
    }
}
0
katma

Çözüm

class CustomFlowLayout: UICollectionViewFlowLayout {

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributesForElementsInRect = super.layoutAttributesForElements(in: rect)
        var newAttributesForElementsInRect = [UICollectionViewLayoutAttributes]()

        for attributes in attributesForElementsInRect! {

            if !(attributes.representedElementKind == UICollectionElementKindSectionHeader
                || attributes.representedElementKind == UICollectionElementKindSectionFooter) {

               //cells will be customise here, but Header and Footer will have layout without changes.
            }

            newAttributesForElementsInRect.append(attributes)
        }

        return newAttributesForElementsInRect
    }
}


class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let headerNib = UINib.init(nibName: "HeaderCell", bundle: nil)
        collectionView.register(headerNib, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "HeaderCell")

        let footerNib = UINib.init(nibName: "FooterCell", bundle: nil)
        collectionView.register(footerNib, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "FooterCell")
    }


    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

        switch kind {
        case UICollectionElementKindSectionHeader:
            let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderCell", for: indexPath) as! HeaderCell
            return headerView
        case UICollectionElementKindSectionFooter:
            let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "FooterCell", for: indexPath) as! FooterCell
            return footerView
        default:
            return UICollectionReusableView()
        }
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        return CGSize(width: collectionView.frame.width, height: 45)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
        return CGSize(width: collectionView.frame.width, height: 25)
    }
}
0
katma