16

Se si utilizza un UISearchDisplayController con un UITableViewController, quando l'utente tocca la barra di ricerca si anima fino a sostituire la barra di navigazione.Come posso utilizzare UISearchDisplayController con UICollectionViewController?

Mi piacerebbe ottenere lo stesso effetto quando si utilizza UISearchBar nella parte superiore di un UICollectionViewController. Qualche idea?

+0

Ehi, hai fatto qualche progresso in questa domanda? Sto cercando di fare lo stesso ... Tutto quello che ho fatto fino ad ora è aggiungere una barra di ricerca come intestazione di sezione, ma in realtà non rende bene. – aspyct

+0

Non ho niente :(. –

+0

Chiunque potrebbe usare anche questo ... sembra che la soluzione migliore a questo punto potrebbe essere quella di sottoclasse UISearchBar/UISearchDisplayController e insegnare loro come interagire con UICollectionView. – Raconteur

risposta

2

Ho dovuto aggiungere la barra di ricerca in modo programmatico come sottoview di UICollectionReusableView, non riuscivo mai a farlo funzionare tramite IB poiché continuavo a ottenere errori di prototipo durante l'assegnazione di una presa. L'aggiunta della barra di ricerca nel file di implementazione ha funzionato per me.

I metodi rilevanti sono i seguenti.

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:CellIdentifier]; 
    _objectChanges = [NSMutableArray array]; 
    _sectionChanges = [NSMutableArray array]; 
    [self performFetch]; 
    searchBar = [[UISearchBar alloc] 
        initWithFrame:CGRectMake(0.0, 50.0, self.view.bounds.size.width, 
              44.0)]; 
    searchBar.placeholder = @"Search for channels"; 
    searchBar.tintColor = [UIColor blackColor]; 
    searchBar.delegate = self; 
} 


-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 
{ 
    SupplementaryView *header = nil; 

    if ([kind isEqual:UICollectionElementKindSectionHeader]) 
    { 
     header = [self.collectionView dequeueReusableSupplementaryViewOfKind:kind 
                withReuseIdentifier:@"reuseHeader" 
                  forIndexPath:indexPath]; 

     [header addSubview:searchBar]; 

    } 
    return header; 
} 
+0

Qual è il tuo 'SupplementaryView'? – AaoIi

1

Ho appena avuto la stessa richiesta, e mi si avvicinò con una soluzione di cotto a metà, ma di lavoro che non comporta la riscrittura UISearchDisplayController.

(FINE risultato: un UITableView --that risposte a shouldReloadTableForSearchString-- sovrapposto sulla parte superiore del UICollectionView, una volta che si clicca la ricerca è respinto, e avete i vostri risultati nel CollectionView Continuate a leggere se questo è di interesse.)

Nell'IB ha creato un UIViewController in cui ho inserito (vedi screenshot): una vista per scopi di layout -> in cui ho prima rilasciato un UISearchBar e un controller di visualizzazione. Nella stessa vista (affiancata) ho rilasciato un UICollectionView con un UICollectionViewCell personalizzato. Poi ho inserito un UITableViewProvider (con un UITableCell personalizzato, ma non è obbligatorio, puoi anche ignorare UITabBarItem e l'elemento Nav nello screenshot, che è irrilevante)

Ho impostato l'altezza di UITableView a 0 e cablato tutti gli Outlets e delegati, e il risultato netto è il seguente, quando il cursore entra in UISearchBox, l'overlay UITableView in cima a UICollectionView, come si digita il shouldReloadTableForSearchString del e i risultati appaiono nella tabellaView; Su searchBarSearchButtonClicked ho semplicemente impostato il dataSource di UICollectionView e chiamato reloadData sul suo outlet, et Voila.

Si potrebbe pensare che Apple dovrebbe generare il controller di visualizzazione della ricerca; forse in una versione futura?

(questo funziona perché questo è il modo in cui il controller UISearchDisplay è ottimizzato, IIRC c'è in realtà un UITableView per l'immissione di caratteri impilati uno sopra l'altro)

(non inviare codice perché c'è un po 'coinvolto; plz chiedere se tutto ciò che non è semplice)

enter image description here

+1

Hai implementato questa o solo la teoria?Si prega di approfondire su quali metodi delegare. Grazie. – chandu

0

qui solo un codice swift - ha lavorato per me!

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

    let headerView = self.mainPictureCollectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "headerView", forIndexPath: indexPath) 

    headerView.addSubview(searchBar) 
    return headerView 
}