che sto cercando di creare un'esperienza simile ai contatti applicazioni in iOS 8. I componenti principali di questo sono:UISearchController con UIBarPositionTopAttached genera UISearchBar fuori schermo; impossibile avere UISearchController standard con UITableView?
- mantenere la barra di ricerca fisso al di sotto della barra di navigazione
- Avere la barra di ricerca allegare al la parte superiore della vista (funzionalità standard) durante la presentazione.
Questo, tuttavia, è più facile a dirsi che a farsi. Dopo un po 'di difficoltà con tableHeaderView
(che non consentiva l'interazione davanti alla vista tabella, ed era complesso con il posizionamento viewDidLayoutSubviews
), ho deciso di incorporare un UITableView
all'interno di un UIViewController
, così ho potuto aggiungere il UISearchBar
come sottoview . Questo ha funzionato abbastanza bene e ha consentito l'interazione con la barra di ricerca in tutte le posizioni di scorrimento e gli inset non erano difficili da calcolare.
Tuttavia, quando viene attivata, la barra di ricerca viene troncata sotto la barra di stato. Sembra un problema semplice, anche se non l'ho provato con la esatta implementazione in un UITableViewController
. Quindi, ho provato a verificare che tutte le mie proprietà fossero impostate per l'allineamento, in ogni controller di visualizzazione possibile.
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;
self.automaticallyAdjustsScrollViewInsets = NO;
Ho provato ogni possibile combinazione di questi, in viewWillAppear così come viewDidLoad, così come le barre di navigazione traslucide e diversi fotogrammi di partenza per la vista tavolo e barra di ricerca. Senza fortuna. Così, ho provato a regolare i frame o i vincoli, magari usando la topLayoutGuide o semplicemente 0. Sfortunatamente, la regolazione del frame in uno dei metodi UISearchControllerDelegate non ha effettivamente regolato la sua posizione presentata e l'aggiunta di vincoli si interrompe immediatamente all'avvio dell'animazione attiva (a causa di super.top non esistente nella gerarchia della vista al momento, la rimozione dei vincoli in willPresent non ha fatto assolutamente nulla).
Dopo aver lottato per un po 'di più, ho provato attuazione positionForBar
come delegato s' il UISearchBar
:
- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
questo sembrava regolare l'altezza, ma la barra di ricerca vola via la parte superiore della vista. Quando attivata, la barra di ricerca sembra apparire direttamente sopra nell'area visibile. Questo è anche peggio di quello che viene ritagliato dietro o sotto lo UIStatusBar
. Ho anche cercato di nascondere la barra di stato quando il controller di ricerca diventa attivo, ma l'implementazione condizionale prefersStatusBarHidden
non ha funzionato affatto (restituendo YES
funziona perfettamente senza UISearchController
attivo, ma quando attivo mostra nuovamente la barra di stato o viene visualizzato sotto di esso). Presumo che questo sia dovuto al fatto che UISearchController
si rifiuta di obbedire a qualsiasi standard o regola, come è ora dolorosamente chiaro.
Ho cercato di capire questo fuori per un paio di giorni ormai, e non riesco a pensare a una soluzione, oltre reimplementare il UISearchController
classe/animazione del tutto. Per favore aiuto!
Grazie per la risposta! Sfortunatamente, sebbene questa implementazione funzioni alla grande, non soddisfa i miei requisiti (n. 1 e n. 2 in cima alla domanda). Ho bisogno che la barra di ricerca rimanga fissa anche durante lo scorrimento. – insanj
@insanj hai provato ad impostare la cornice della barra di ricerca mentre la traduzione y nella vista scorreva? – cyril
No, non ha senso in questo contesto. Sto già aggiungendo la barra di ricerca direttamente come sottoview, _sopra_ la vista tabella. Se fosse un 'tableHeaderView', questo potrebbe avere senso, ma quella soluzione è comunque imperfetta (i tocchi passano attraverso). Se intendevi forse la traduzione a y della vista tabella dei risultati di ricerca, sembrerebbe troppo poco troppo tardi: alla fine, avrei bisogno che la regolazione del frame avvenga prima di qualsiasi scorrimento (si oscura prima di qualsiasi ricerca fino a una ricerca è completo (standard 'UISearchController'), e non ci si è mai verificatoScroll). – insanj