2010-08-10 3 views
7

Ho visto l'esempio di Apple "TableSearch" che quando toccato i suoi pulsanti di ambito si trova sotto la barra di ricerca. http://developer.apple.com/iphone/library/samplecode/TableSearch/Introduction/Intro.htmlPerché UISearchBar ei relativi pulsanti di ambito sono visualizzati su una riga?

Ma quando faccio mia si guarda bene all'inizio, ma quando lo tocco sembra che brutto, pulsanti di ambito e barra di ricerca vengono visualizzati nella stessa riga come questa: http://cl.ly/BN9

Cosa devo fare come nell'esempio "TableSearch" nell'iPad?

sto facendo tutto in IB e ha cercato di modificare la barra di ricerca programatically dal controller:

- (void)viewDidLoad { 

     [super viewDidLoad]; 
     self.tableView.rowHeight = 88.0f; 
     self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height); 
self.searchDisplayController.searchResultsTableView.rowHeight = self.tableView.rowHeight; 


    //BELOW DID NOT WORK: 
    CGRect b = self.searchDisplayController.searchBar.bounds; 
    self.searchDisplayController.searchBar.bounds = CGRectMake(b.origin.x, b.origin.y, b.size.width, self.tableView.rowHeight); 
    b = self.searchDisplayController.searchBar.frame; 
    self.searchDisplayController.searchBar.frame = CGRectMake(b.origin.x, b.origin.y, b.size.width, self.tableView.rowHeight); 

    //BELOW WORKS PERFECT BUT IS A PRIVATE METHOD, HENCE I AM NOT SUPPOSED TO USE IT 
    //[self.searchDisplayController.searchBar setCombinesLandscapeBars:NO]; 

    } 

Grazie in anticipo.

risposta

10

Ho riscontrato anche questo errore, e ho entrambi presentato una relazione a Apple e ho richiesto assistenza tecnica. Ti farò sapere come va. Nel frattempo ti darò una breve panoramica su questo bug.

Sull'iPhone, per preservare il prezioso spazio sullo schermo verticale in modalità orizzontale, UISearchDisplayController imposta UISearchBar per combinare la barra di ricerca e il campo di ricerca in un unico layout orizzontale. Funziona piuttosto bene a causa della maggiore dimensione orizzontale dello schermo (480 punti in Landscape). Sfortunatamente, non funziona molto bene sull'iPad, dove in modalità Landscape la modifica dell'interfaccia utente non è necessaria in primo luogo perché hai un sacco di spazio verticale. Hai anche solo 320 pixel di spazio di visualizzazione orizzontale nella vista principale di UISplitViewController, non il maggiore 480 di iPhone. Il risultato è un iSore.

Presumibilmente il problema è che UISearchDisplayController si sta comportando male nel suo willRotateToInterfaceOrientation: duration: method. In particolare, non si preoccupa di verificare se si trova su un iPhone o meno prima di impostare la proprietà combinaLeggiereBars sul suo UISearchBar. Il kludge API privato nel tuo codice funziona perché corregge tale supervisione in UISearchDisplayController. Ma ovviamente Apple farà piovere su di te la furia degli antichi per l'utilizzo di API non documentate, quindi non puoi. Davvero siamo in balia di Apple su questo.

Se si è disposti a rinunciare agli occhi e alla comodità di UISearchDisplayController, è possibile utilizzare UISearchBar sans UISearchDisplayController e gestire autonomamente gli aspetti della presentazione. Ovviamente questo richiede molto più codice e sarebbe inutile se gli ingegneri API di Apple facessero il loro lavoro, ma almeno per risolvere il bug del display.

Se sei Apple puoi utilizzare le tue API non documentate, ecco perché Mail.app non ha questo problema.

UPDATE

La segnalazione che ho depositato presso Apple è # 8.344.719.

+0

ho trovato tre persone che dicono l'hanno riferito che bug. Potresti dire il numero del bug? – nacho4d

+0

Il motivo per cui Mail.app non ha questo problema è perché non usa UISearchDisplayController. Nessuna delle app per iPad di Apple funziona, ed è probabilmente il motivo per cui questo bug esiste. – Darren

+0

Ho archiviato anche un bug. È # 9689005. – Moshe

0

Quando si fissò i confini e la struttura per la barra di ricerca, come per il telaio qui:

blabla.searchBar.frame = CGRectMake(b.origin.x, 
            b.origin.y, 
            b.size.width, 
            self.tableView.rowHeight); 

sembra che ci sia un problema con l'altezza. I pulsanti di ambito richiedono un po 'di spazio sotto la barra di ricerca, quindi è necessario aumentare l'altezza di entrambi i limiti e il fotogramma.

Se si mostrano e si nascondono i pulsanti di ambito su alcuni eventi, è necessario regolare ogni volta le dimensioni della cornice.

0

sto ottenendo questo problema su un iPad, ma posso farlo funzionare se inserisco nel mio file di implementazione:

@synthesize tableView; 

Sto indovinando c'è qualcosa di male con il XIB caricamento , ma non so perché questo lo risolvesse.

1

utilizzando il seguente codice, non sarà possibile ottenere avvertimento:

if ([self.searchDisplayController.searchBar respondsToSelector:@selector(setCombinesLandscapeBars:)]) 
{ 
    objc_msgSend(self.searchDisplayController.searchBar, @selector(setCombinesLandscapeBars:), NO); 
}