2014-04-26 13 views
8

Sto cercando di aggiungere la ricerca al mio UITableViewController tramite UISearchDisplayController, tuttavia sto vedendo un problema di animazione molto strano quando la ricerca inizia e finisce.iOS 7 UISearchDisplayController Animation Glitches

Su iPhone, l'animazione nella barra di navigazione funziona correttamente. Tuttavia, al termine della ricerca, la barra di navigazione resta indietro rispetto alla barra di ricerca mentre si anima. Ciò fa sì che una striscia bianca venga visualizzata tra la barra di navigazione e la barra di ricerca. Su iPad, le animazioni sono completamente incasinate.

iPhone video

e

iPad video

Come i video di cui sopra mostrano, le applicazioni azionari non soffrono di questi difetti di animazione. Qualcuno ha qualche idea su cosa sta causando i problemi?

Sto creando il UISearchDisplayController con quanto segue all'interno del controller di visualizzazione "Master".

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UISearchBar* searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)]; 
    searchBar.delegate = self; 
    self.tableView.tableHeaderView = searchBar; 

    self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; 
    self.searchController.delegate = self; 
    self.searchController.searchResultsDataSource = self; 
    self.searchController.searchResultsDelegate = self; 
} 

Ho anche provato a farlo usando gli Storyboard ma si verificano gli stessi problemi di animazione.

+0

Si verifica anche su un dispositivo reale? – Mario

+0

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

+0

@ Mario sì, succede sul dispositivo. – Rick

risposta

1

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.

+1

Questo aiuta, ma non lo aggiusta completamente. Il colore di sfondo della barra di navigazione è impostato tramite '-barTintColor', che è piuttosto difficile da abbinare quando si usa una barra traslucida. Inoltre non funzionerà se stai usando un'immagine di sfondo. FWIW, questo sembra essere risolto in iOS 8. – Rick

+0

@Rick ho aggiornato la risposta per caso di navbars traslucido –

1

trovo la soluzione migliore per me, è appare esattamente come ho bisogno, sto usando rapida ma se avete bisogno si può facilmente tradotto a Objective-C

self.edgesForExtendedLayout = .None 

let barBacgroundView = UIView(frame: CGRectMake(0, 0, self.view.frame.size.width, 64)) 
barBacgroundView.backgroundColor = self.tableView.backgroundColor 
UIApplication.sharedApplication().delegate!.window!!.insertSubview(barBacgroundView, atIndex: 0) 

Inserire questo codice in viewDidLoad() e questo è tutto. Spero che questo aiuti :)