2014-07-25 3 views
10

Nel talk del WWDC 2014 "A Look Inside Presentation Controllers" i presentatori hanno mostrato come impostare un UISearchController in un UITableView. Lo fanno impostando la searchBar's search di searchController, quindi impostandola come tableViewer di tableView. Sfortunatamente, non esiste un equivalente di tableHeaderView per UICollectionView. Con UISearchDisplayController, questo sarebbe semplice: creare un UISearchBar e aggiungerlo a un'intestazione di sezione UICollectionView personalizzata, quindi inizializzare UISearchDisplayController con la barra di ricerca. Il problema è che non è possibile inizializzare un UISearchController con UISearchBar o persino impostare la barra di ricerca perché è una proprietà di sola lettura. Credo che la mia vera domanda sia, quali sono le mie opzioni? Esiste un modo "buono" per implementare la ricerca senza UISearchDisplayController o UISearchController?Non è possibile utilizzare UISearchController con UICollectionView?

risposta

14

Con UISearchDisplayController, questo sarebbe semplice: creare un UISearchBar e aggiungerlo alla un'intestazione di sezione UICollectionView personalizzato, quindi inizializzare l'UISearchDisplayController con la barra di ricerca

La barra di ricerca in un'UISearchController è stato creato per tu. Quando viene chiesto la vista supplementare nel metodo origine dati

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 

aggiungere il searchController.searchBar come una visualizzazione secondaria della vista supplementare. Non dimenticare di chiamare

[searchController.searchBar sizeToFit] 

per dare alla barra di ricerca la dimensione appropriata.

+0

Grazie! Ha funzionato alla grande – Januzellij

+3

questo non funziona per me. Puoi fornire l'intera implementazione? – rigdonmr

+0

Non sono sicuro che questo sia ancora il modo "aggiornato" per farlo, qualcuno può confermare? – Chisx

4

La mia prima domanda: perché non è possibile capovolgere la logica e invece di creare una barra di ricerca, creare innanzitutto un UISearchController, prendere la barra di ricerca e aggiungerla all'intestazione della sezione?

In secondo luogo, i layout delle viste di raccolta non sono semplici come le viste di tabella. È difficile per la ricerca indovinare le tue intenzioni con i layout di visualizzazione della raccolta mentre una vista tabella è piuttosto semplice. Quindi, nel caso di una vista di raccolta, sei libero di aggiungere una barra di ricerca alla vista ma animarla in uno stato attivo richiederà un po 'di lavoro. (Sottoclassi UISearchController e restituisci il tuo controller di animazione, quindi esegui qualsiasi animazione o implementa i metodi da UIViewControllerAnimatedTransitioning sulla sottoclasse e non chiamare super, entrambi dovrebbero funzionare)

Qualcosa che potresti voler provare è facendo apparire la barra di ricerca fuori dallo schermo. Questa è un'animazione integrata UISearchController supporta quando setActive: viene chiamato e la barra di ricerca non è in alcun punto della gerarchia della vista. Il calendario fa questo ... è fantastico. Invece di avere sempre una barra di ricerca gigante sempre presente, puoi ridurre la ricerca a un'icona che guida la presentazione.

Infine, ci sono sicuramente bug. Si prega di file bug quando non si riesce a far funzionare le cose che si dovrebbe. Lo so, è un disco rotto, ma è davvero una necessità.

+1

Puoi fornire maggiori informazioni su cosa è necessario per visualizzare la barra di ricerca dallo schermo come suggerisci? Sto cercando di realizzare questo e non avere gioia. – wrightak

+0

@wrightak Hai provato a fare ciò che ha menzionato "Questa è un'animazione integrata UISearchController supporta quando setActive: viene chiamato e la barra di ricerca non è in alcun punto nella gerarchia della vista"? Perché sembra abbastanza facile da implementare. – OhadM