Domanda

Non riesco a far posizionare una UISearchBar dall'estrema sinistra all'estrema destra nella barra di navigazione. Nel metodo - (void) viewDidLoad, ho il seguente codice:

UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame];
sb.delegate = self;
self.navigationItem.titleView = sb;
[sb sizeToFit];
[sb release];

Quando costruisci ed esegui, a prima vista sembra perfetto. Tuttavia, guardando più da vicino, puoi dire che c'è un margine / spazio sulla sinistra. Questo non sarebbe un grosso problema nel grande schema delle cose, ma quando tocco la barra di ricerca per avviare una ricerca, anima il pulsante Annulla in vista. Poiché la barra di ricerca è posizionata leggermente a destra, l'animazione è a scatti e il pulsante Annulla cade alla fine in questo modo: testo del link

Sembra che UINavigationItem sia come una tabella con tre celle, in cui è presente un'imbottitura sul primo e sull'ultimo che non riesco a rimuovere - né sembra esserci un modo per "unire" tutto insieme e quindi posizionare la barra di ricerca lì. So che questo aspetto è possibile, perché la ricerca AppStore ha una barra di ricerca nella barra di navigazione e arriva fino ai bordi. Qualcuno sa come far andare la barra di ricerca fino ai bordi in modo che l'animazione del mio pulsante di annullamento scorrevole funzioni correttamente?

È stato utile?

Soluzione 3

Penso di aver trovato la risposta, anche se non ho testato per verificarlo. Nel numero che ho fornito sopra, ho la seguente struttura:

controller della barra delle schede - > controller di navigazione - > visualizza controller (s)

La barra di ricerca in questione era in un controller di visualizzazione, che a sua volta si trovava nel controller di navigazione, il cui controller di navigazione si trova nella barra delle schede.

Stavo guardando casualmente i corsi Stanford CS 193P (primavera 2009) e alla fine della lezione 13, la risposta potrebbe essere stata presentata. Alan Cannistraro ha dichiarato che la struttura dell'app Presence dovrebbe avere questa struttura:

questa struttura http://img143.imageshack.us/img143/6/viewcontrollerstructure .jpg

dove il controller della vista inferiore (adiacente al controller della barra delle schede) era il controller della vista che aveva il controllo della barra di ricerca. Ha avvertito che se non è stato fatto in questo modo, ti imbatterai in "problemi". Forse il problema che ho affrontato? Credo di sì.

Altri suggerimenti

In realtà, c'è una soluzione davvero semplice. Tutto quello che devi fare è creare una vista a larghezza zero per l'elemento posteriore:

UIView *hackView = [[UIView alloc] initWithFrame:CGRectZero];
UIBarButtonItem *hackItem = [[UIBarButtonItem alloc] initWithCustomView:hackView];      
self.navigationItem.backBarButtonItem = hackItem;
[hackView release];
[hackItem release];

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[searchBar sizeToFit];
self.navigationItem.titleView = searchBar;
[searchBar release];

Assicurati di farlo nel tuo metodo loadView, non in init. Non sono sicuro del perché ciò faccia la differenza, ma lo fa.

Apparentemente si tratta di tempismo. Avendolo in loadView ha smesso di funzionare per me, ma mettendolo in vistaWillAppear funziona (con un controllo in modo che sia fatto solo una volta, ovviamente). Penso che l'idea sia quella di impostare titleView dopo che un'inizializzazione è già stata completata.

Il codice seguente nasconde la barra di navigazione solo per questo UIViewController:

- (void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

Quindi, per far sì che UISearchBar venga visualizzato al posto di UINavigationBar, sul controller della vista principale basta avere la barra di ricerca in cui la barra di navigazione sarebbe normalmente!

Forse apple sta usando un UISearchDisplayController per fare queste cose.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top