Pertanyaan Bagaimana cara mengubah warna latar belakang seluruh bagian di UICollectionView?


Di UICollectionView, saya ingin memberikan seluruh bagian warna latar seragam, bukan untuk satu sel atau untuk seluruh tampilan koleksi.

Saya tidak melihat ada metode delegasi untuk melakukan itu, ada saran?


28
2017-11-28 15:58


asal


Jawaban:


Ini adalah tutorial hebat untuk mengubah warna bagian UICollectionView:

Tautan yang diperbarui, terima kasih kepada pengguna @casamia

http://www.ericjchapman.com/jekyll/update/ios/2014/11/10/ios-changing-section-background-color-in-UICollectionView.html

Pada dasarnya, kita harus subclass UICollectionViewLayoutAttributes, UICollectionReusableView dan UICollectionViewLayout untuk membuat instance UICollectionReusableView sebagai tampilan latar belakang bagian.

Inilah hasilnya:

enter image description here

Silakan ikuti tautan untuk penjelasan lebih rinci.


3
2017-10-22 02:53



Saya belum mencoba ini, tetapi tampaknya bagi saya bahwa Anda perlu menggunakan tampilan dekorasi jika Anda menginginkan latar belakang di belakang sel Anda (seperti rak di aplikasi Buku). Saya pikir Anda harus dapat memiliki pandangan yang berbeda untuk setiap bagian, dan mengaturnya menggunakan metode delegasi layoutAttributesForDecorationViewOfKind:atIndexPath:.


2
2017-11-28 17:34



Idenya adalah mengesampingkan UICollectionViewLayoutAttributes untuk menambahkan atribut warna. Dan kemudian menimpa UICollectionReusableView menerapkan warna ke latar belakang tampilan.

https://github.com/strawberrycode/SCSectionBackground


1
2017-09-19 18:10



Dalam tampilan koleksi, setiap bagian dapat memiliki tampilan tambahan, jadi tempatkan tampilan tambahan untuk setiap bagian lalu tetapkan warna latar ke tampilan tambahan, bukan sel bagian. Saya berharap ini akan membantu.


0
2017-12-03 14:06



Saya pergi dari repo ini di sini https://github.com/SebastienMichoy/CollectionViewsDemo/tree/master/CollectionViewsDemo/Sources/Collections%20Views

Swift 3

subclass uicollectionreusableview

class SectionView: UICollectionReusableView {
   static let kind = "sectionView"
}

subclass uicollectionViewFlowLayout

class CustomFlowLayout: UICollectionViewFlowLayout {

// MARK: Properties

var decorationAttributes: [IndexPath: UICollectionViewLayoutAttributes]
var sectionsWidthOrHeight: [IndexPath: CGFloat]


// MARK: Initialization

override init() {
    self.decorationAttributes = [:]
    self.sectionsWidthOrHeight = [:]

    super.init()
}

required init?(coder aDecoder: NSCoder) {
    self.decorationAttributes = [:]
    self.sectionsWidthOrHeight = [:]

    super.init(coder: aDecoder)
}

// MARK: Providing Layout Attributes

override func layoutAttributesForDecorationView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
    return self.decorationAttributes[indexPath]
}

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    var attributes = super.layoutAttributesForElements(in: rect)
    let numberOfSections = self.collectionView!.numberOfSections
    var xOrYOffset = 0 as CGFloat

    for sectionNumber in 0 ..< numberOfSections {
        let indexPath = IndexPath(row: 0, section: sectionNumber)
        let numberOfItems = self.collectionView?.numberOfItems(inSection: sectionNumber)
        let sectionWidthOrHeight = numberOfItems == 0 ? UIScreen.main.bounds.height : collectionViewContentSize.height//self.sectionsWidthOrHeight[indexPath]!
        let decorationAttribute = UICollectionViewLayoutAttributes(forDecorationViewOfKind: SectionView.kind, with: indexPath)
        decorationAttribute.zIndex = -1

        if self.scrollDirection == .vertical {
            decorationAttribute.frame = CGRect(x: 0, y: xOrYOffset, width: self.collectionViewContentSize.width, height: sectionWidthOrHeight)
        } else {
            decorationAttribute.frame = CGRect(x: xOrYOffset, y: 0, width: sectionWidthOrHeight, height: self.collectionViewContentSize.height)
        }

        xOrYOffset += sectionWidthOrHeight

        attributes?.append(decorationAttribute)
        self.decorationAttributes[indexPath] = decorationAttribute
    }

    return attributes
}
}

terapkan ini

Fungsi delegasi CollectionView

func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) {

    Log.printLog(identifier: elementKind, message: indexPath)
    if elementKind == UICollectionElementKindSectionHeader, let view = view as? ProfileViewHeaderView {

        view.backgroundColor = UIColor(red: (102 / 255.0), green: (169 / 255.0), blue: (251 / 255.0), alpha: 1)
    } else if elementKind == SectionView.kind {
        let evenSectionColor = UIColor.black
        let oddSectionColor = UIColor.red

        view.backgroundColor = (indexPath.section % 2 == 0) ? evenSectionColor : oddSectionColor
    }
}

Ini penting

let layout = CustomFlowLayout()
layout.register(SectionView.self, forDecorationViewOfKind: SectionView.kind)

daftarkan UICollectionReusableView dengan layout bukan collectionView.

satu hal lagi. Aku mengacaukan ketinggian di layoutAttributesForElements. Anda harus mengubahnya untuk proyek Anda sendiri.


-1
2017-08-08 15:38



Saya telah mengubah warna latar belakang setiap bagian dengan cara yang sangat sederhana dalam metode berikut: Tapi saya tidak yakin apakah itu hal yang benar untuk dilakukan. Tapi itu berhasil.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    FamilyCalendarCellItemCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"calendarItem" forIndexPath:indexPath];
    Event *event;
    _headerView = [collectionView dequeueReusableSupplementaryViewOfKind:
                   UICollectionElementKindSectionHeader withReuseIdentifier:@"EventHeader" forIndexPath:indexPath]; //headerView is declared as property of Collection Reusable View class
    if(indexPath.section==0) {

        cell.backgroundColor=[UIColor orangeColor];
        }
    else if(indexPath.section==1) {

        cell.backgroundColor=[UIColor yellowColor];

    }

    return cell;
}

-2
2018-02-29 04:58