Soluzione barra di navigazione non traslucido (meno codice, meno universalità)
il glitch bianco che si vede è il colore di sfondo di un Tableview che è visibile attraverso un divario tra barra di navigazione e la barra di ricerca. Il divario è sicuramente la supervisione degli sviluppatori Apple.
Quindi la soluzione si presenta così:
- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
UIView *topTableViewBG = [[UIView alloc] initWithFrame:CGRectMake(0, -64, CGRectGetWidth(self.tableView.bounds), 64)];
topTableViewBG.backgroundColor = self.navigationController.navigationBar.backgroundColor;
topTableViewBG.tag = 1234567;
[self.tableView insertSubview:topTableViewBG belowSubview:self.tableView.tableHeaderView];
}
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
[[self.tableView viewWithTag:1234567] removeFromSuperview];
}
qui aggiungo una visualizzazione personalizzata proprio sotto la barra di ricerca. Succede poco prima della transizione al normale VC. La vista è posizionata nel punto speciale in modo che copra lo spazio tra la barra di navigazione e la barra di ricerca. Al termine della transizione, rimuovo la vista personalizzata.
UPDATE: la soluzione universale (più codice, più universalità)
la soluzione di cui sopra è buono solo se c'è barra di navigazione non traslucido. Per la barra di navigazione traslucida c'è una sfida per trovare il colore corretto per la nostra vista 'gap-stopper'. Ma non appena saremo abbastanza liberi di cambiare il colore della barra di ricerca, possiamo usare il colore della barra di ricerca per il gap-stopper.
consente di fare alcune modifiche al nostro codice
In primo luogo, abbiamo bisogno searchbar non traslucido, immagine di sfondo in modo da impostare a barra di ricerca:
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
[searchBar setBackgroundImage:[UIImage pixelImageWithColor:SEARCHBAR_GRAY_COLOR] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
searchBar.delegate = self;
self.tableView.tableHeaderView = searchBar;
Ecco il metodo categoria UIImage, che è stato utilizzato in precedenza :
+ (UIImage *)pixelImageWithColor:(UIColor *)color {
CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate (NULL, 1, 1, 8, 0, cs, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);
CGColorSpaceRelease (cs);
CGContextSetFillColorWithColor (ctx, color.CGColor);
CGContextFillRect (ctx, CGRectMake (0.0f, 0.0f, 1.0f, 1.0f));
CGImageRef cgImage = CGBitmapContextCreateImage (ctx);
CGContextRelease (ctx);
UIImage *result = [UIImage imageWithCGImage:cgImage];
CGImageRelease (cgImage);
return result;
}
poi cambiare il nostro metodo searchDisplayControllerWillEndSearch
:
- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
UIView *topTableViewBG = [[UIView alloc] initWithFrame:CGRectMake(0, -64, CGRectGetWidth(self.tableView.bounds), 64)];
topTableViewBG.backgroundColor = SEARCHBAR_GRAY_COLOR;
topTableViewBG.tag = 1234567;
[self.tableView insertSubview:topTableViewBG belowSubview:self.tableView.tableHeaderView];
}
e, infine, il metodo searchDisplayControllerDidEndSearch
rimane invariato:
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
[[self.tableView viewWithTag:1234567] removeFromSuperview];
}
Onestamente questa soluzione è più universale e sembra molto più bella di una che ho descritto nella prima parte della risposta.
Si verifica anche su un dispositivo reale? – Mario
Non uso UISearchDisplayController nel mio codice a causa di questo tipo di problema, insieme alla scarsa personalizzazione quando si visualizzano i risultati su un Popover. Dai un'occhiata a questo post del blog. Potrebbe aiutarti a correggere questo comportamento: http://petersteinberger.com/blog/2013/fixing-uisearchdisplaycontroller-on-ios-7/ – Cezar
@ Mario sì, succede sul dispositivo. – Rick