2012-12-14 10 views
20

Quindi ho implementato un corretto con una funzionalità di ricerca e sectionIndexTitles. Ora, sto cercando di implementare un UICollectionView e sta funzionando finora, tranne che non posso facilmente avere sectionIndexTitles (la barra di scorrimento di destra).SectionIndexTitles per UICollectionView

Se guardo l'applicazione di Facebook, sembra uno UICollectionView, ma con effettivamente sectionIndexTitles e una barra di ricerca. Non riesco a trovare tali funzioni per il modello UICollectionView.

Qualche idea ?!

Grazie!

enter image description here

+0

Vorrei una buona risposta su questo, anche; Vorrei anche evitare di nascondere un'altra vista tabella, se possibile (problemi di memoria). –

risposta

15

ho avuto un requisito analogo (per una raccolta orizzontale vista) e ho finito per costruire da solo una sottoclasse della vista indice.

ho intenzione di open-source, ma che sarà probabilmente necessario attendere fino al mese prossimo, quindi ecco uno stub per iniziare:

YMCollectionIndexView.h

@interface YMCollectionIndexView : UIControl 

- (id) initWithFrame:(CGRect)frame indexTitles:(NSArray *)indexTitles; 

// Model 
@property (strong, nonatomic) NSArray *indexTitles; // NSString 
@property (readonly, nonatomic) NSUInteger currentIndex; 
- (NSString *)currentIndexTitle; 

@end 

YMCollectionIndexView. m

#import "YMCollectionIndexView.h" 

@interface YMCollectionIndexView() 
@property (readwrite, nonatomic) NSUInteger currentIndex; 
@property (strong, nonatomic) NSArray *indexLabels; 
@end 

@implementation YMCollectionIndexView 

- (id) initWithFrame:(CGRect)frame indexTitles:(NSArray *)indexTitles { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.indexTitles = indexTitles; 
     self.currentIndex = 0; 
     // add pan recognizer 
    } 
    return self; 
} 

- (void)setIndexTitles:(NSArray *)indexTitles { 
    if (_indexTitles == indexTitles) return; 
    _indexTitles = indexTitles; 
    [self.indexLabels makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
    [self buildIndexLabels]; 
} 

- (NSString *)currentIndexTitle { 
    return self.indexTitles[self.currentIndex]; 
} 

#pragma mark - Subviews 

- (void) buildIndexLabels { 
    CGFloat cumulativeItemWidth = 0.0; // or height in your (vertical) case 
    for (NSString *indexTitle in self.indexTitles) { 
      // build and add label 
     // add tap recognizer 
    } 
    self.indexLabels = indexLabels; 
} 

#pragma mark - Gestures 

- (void) handleTap:(UITapGestureRecognizer*)recognizer { 
    NSString *indexTitle = ((UILabel *)recognizer.view).text; 
    self.currentIndex = [self.indexTitles indexOfObject:indexTitle]; 
    [self sendActionsForControlEvents:UIControlEventTouchUpInside]; 
} 

// similarly for pan recognizer 

@end 

Secondo lei c ontroller:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.collectionIndexView addTarget:self action:@selector(indexWasTapped:) forControlEvents:UIControlEventTouchUpInside]; 
    // similarly for pan recognizer 
} 

- (void)indexWasTapped:(id)sender { 
    [self.collectionView scrollToIndexPath:...]; 
} 

// similarly for pan recognizer 
+0

Sembra fantastico! Se lo apri, la comunità di iOS in generale ti amerà per questo, ne sono sicuro. Bounty assegnato! –

+3

ho montata su un'implementazione completa (con rivalutazioni) in [un gist proprio qui] (https://gist.github.com/kreeger/4756030) - fatemi sapere cosa ne pensate. –

+0

Sembra che @BenKreeger abbia creato un repository/cocoapod GitHub per la sua soluzione: https://github.com/kreeger/BDKCollectionIndexView –

-2

è possibile fornire questa intestazione implementando e restituendo un valore per la seguente funzione per UICollectionViewDataSource

collectionView:viewForSupplementaryElementOfKind:atIndexPath: 

noti che la dimensione dell'intestazione sarà dal valore di altezza del CGRect restituito dalla raccolta del metodo UICollectionViewFlowLayoutDelegateVisualizza: layout: referenceSizeForHeaderInSection:

+1

La domanda si riferisce a 'sectionIndexTitles' sul lato destro dello schermo e non alle intestazioni di sezione supplementare. –

+0

Hai ragione, ho perso la domanda su questo. – Samuel

0

Hai trovato qualche soluzione?

Sto cercando di implementare le stesse funzionalità per UICollectionView.

finora per il sectionIndexTitles che sto usando UITableView personalizzato con le stesse sezioni come l'UICollectionView originale, ma con celle vuote. Di conseguenza ho una classe IndexTableView

indexTableView = [[IndexTableView alloc] initWithFrame:CGRectZero]; 
[self.view addSubview:indexTableView]; 

... 

indexTableView.frame = CGRectMake(CGRectGetWidth(self.view.frame) - 40, 0, 40, CGRectGetHeight(self.view.frame)); 
indexTableView.separatorStyle = UITableViewCellSeparatorStyleNone; 
indexTableView.sectionHeaderHeight = 0; 
indexTableView.backgroundColor = [UIColor clearColor]; 

aggiungo IndexTableView in cima alla UICollectionView, ed ho ottenuto lo stesso effetto visivo come un UITableView originale. Ora sto cercando di collegare la selezione dell'indice e UICollectionView e farlo funzionare.

Modificato: Ho appena aggiunto un UISearchBar al UICollectionController

add seguente codice al vostro sottoclasse della UICollectionController

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
... 
    self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.collectionView.frame.size.width, 44)]; 
    self.searchBar.autocorrectionType = UITextAutocorrectionTypeNo; 
    self.searchBar.delegate = self; 
    [self.collectionView addSubview:self.searchBar]; 
    [self.collectionView setContentOffset:CGPointMake(44, 0)]; 
} 

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { 
    if (section == 0) { 
     return UIEdgeInsetsMake(CGRectGetHeight(self.searchBar.frame), 6, 0, 6); 
    } 
    return UIEdgeInsetsMake(0, 6, 0, 6); 
} 
+0

Funziona ?! – abisson

+0

UISearchBar per UICollectionController funziona. IndexTableView non completamente, non l'ho ancora finito. – Eugene

0

Ora è possibile utilizzare semplicemente (da iOS 10.3)

optional func indexTitles(for collectionView: UICollectionView) -> [String]?

Quale aspetta un array come: ['A', 'B' ,'C'] come valore di ritorno.

+1

questo lavoro per chiunque? anche in un semplice esempio non riesco a ottenere la funzione indexTitles per essere chiamata. –

+0

Comprende anche come utilizzare questo nuovo metodo di origine dati. Ho provato sia su iOS 10.3 che su tvOS 10.2 (come menzionato nei documenti), ma non ho mai mostrato titoli di indice. –

+0

Non ho potuto farlo funzionare su iOS (non ho ancora provato tvOS). La documentazione online afferma che è disponibile su iOS 10.3+ e tvOS 10.2+, ma guardando i file di intestazione, dice solo API_AVAILABLE (tvos (10.2)). – cargath

Problemi correlati