7

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?

  1. mantenere la barra di ricerca fisso al di sotto della barra di navigazione
  2. 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.

debug hierarchyinactive stateactive state

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!

risposta

0

per il comportamento da te descritto, questo funziona grande per me

var resultSearchController = UISearchController() 

E il seguente nella funzione viewDidLoad:

//Search Bar 
     self.resultSearchController = ({ 
      let controller = UISearchController(searchResultsController: nil) 
      controller.searchResultsUpdater = self 
      controller.searchBar.sizeToFit() 
      controller.dimsBackgroundDuringPresentation = false 

      self.tableView.tableHeaderView = controller.searchBar 
      self.definesPresentationContext = true 
      return controller 
     })() 
+0

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

+0

@insanj hai provato ad impostare la cornice della barra di ricerca mentre la traduzione y nella vista scorreva? – cyril

+0

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

0

Quello che ha funzionato per me è stato quello di creare una sottoclasse UISearchController e sovrascrivere il prefersStatusBarHidden in la sottoclasse.

fare anche sicuro View Controller Sulla Barra di stato Aspetto è impostato su YES

E nel vostro viewcontroller contenente la barra/di ricerca Tableview:

self.definesPresentationContext = YES; 
0

Ho lo stesso problema. Aggiungo uno UISearchController a UIViewController, non usando tableView.header. E lo UISearchBar.superview.frame.origin.y è -44. Quindi non puoi vedere la barra di ricerca.

Metodo 1: È possibile modificare il frame di UISearchBarWrapperView nel didPresentSearchController, il delegato di UISearchControllerDelegate. Ma si vedrà l'animazione di questo processo.

Metodo 2: come dice JBlake. Impostare self.definesPresentationContext = YES; dopo il UISearchController è init. Funziona!

0

quello che ho capito è se u bisogno searchbar sotto navigationbar come u menzionato in 1 # sua molto facile basta impostare un valore booleano (Soluzione per 1 #) searchController.hidesNavigationBarDuringPresentation = true

Purtroppo non potevo fissare la barra di ricerca-fuori dalla visualizzazione-problema, mentre navigationbar è nascosto.