2012-11-28 6 views

risposta

2

Non l'ho ancora provato, ma mi sembra che sia necessario utilizzare le viste decorative se si desidera uno sfondo dietro le celle (come lo scaffale nell'app Libri). Penso che dovresti essere in grado di avere visualizzazioni diverse per ogni sezione e impostarle utilizzando il metodo delegato layoutAttributesForDecorationViewOfKind:atIndexPath:.

0

Nella vista di raccolta, ogni sezione può avere una vista supplementare, quindi inserire viste supplementari per ogni sezione, quindi impostare il colore di sfondo su viste supplementari anziché celle di sezione. Spero che sarà di aiuto.

+0

Durante la lettura di visualizzazioni supplementari, trovo solo esempi quando viene utilizzato per intestazioni e piè di pagina. Hai qualche esempio e/o codice funzionante per la tua risposta. –

+0

L'ho eseguito utilizzando il layout personalizzato della vista raccolta. Nel layout personalizzato il mio riquadro di visualizzazione supplementare è uguale all'intero telaio di sezione. – Jirune

+1

Come sei riuscito a farlo? se tu potessi dire che sarebbe grandioso. Grazie –

2

Questo è un ottimo tutorial per cambiare sezione UICollectionView colore:

collegamento aggiornato, grazie alla @casamia utente

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

In sostanza, dovremo creare una sottoclasse UICollectionViewLayoutAttributes, UICollectionReusableView e UICollectionViewLayout in ordine per creare un'istanza UICollectionReusableView come vista di sfondo della sezione.

questo è il suo risultato:

enter image description here

segui il link per maggiori informazioni spiegazione.

+0

Il link che hai allegato è cambiato. http://www.ericjchapman.com/jekyll/update/ios/2014/11/10/ios-changing-section-background-color-in-UICollectionView.html – casamia

+3

E ora anche il collegamento fornito da @casamia è morto. Ecco un link al progetto github almeno: https://github.com/ericchapman/ios_decoration_view – TylerJames

-2

Ho cambiato il colore di sfondo di ciascuna sezione in un modo molto semplice con il seguente metodo: Ma non ero sicuro se fosse la cosa giusta da fare. Ma ha funzionato.

- (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; 
} 
+0

Questo cambia solo il colore di sfondo delle celle. La domanda sta chiedendo come modificare il colore di sfondo della vista raccolta stessa all'interno di una determinata sezione – TylerJames

0

sono andato fuori di questo repo qui https://github.com/SebastienMichoy/CollectionViewsDemo/tree/master/CollectionViewsDemo/Sources/Collections%20Views

Swift 3

sottoclasse uicollectionreusableview

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

sottoclasse uicollectionViewFlowLayout

0.123.516,41 mila
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 
} 
} 

attuare questa

funzione CollectionView delegato

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

Questo è importante

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

Registrazione del UICollectionReusableView con layout non CollectionView.

un'altra cosa. Ho giocato con l'altezza in layoutAttributesForElements. dovresti cambiarlo per il tuo progetto.