2014-05-05 7 views
5

Sto implementando un UISearchBar nella parte superiore di un UITableView.UISearchBar to UISearchDisplayController transizione è disattivata da 20px

Nel mio ViewDidLoad ho impostato self.edgesForExtendedLayout = UIRectEdgeNone.

Ecco come aggiungere la mia UISearchBar. Sto solo l'aggiunta di un UISearchBar all'intestazione della mia UITableView e regolando l'offset contenuti:

// Table View 
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.screenWidth, self.screenHeight)]; 

self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

// Customize table appearance 
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 
self.tableView.backgroundColor = [UIColor tableBackgroundColor]; 

// Define the table's datasource 
self.tableView.dataSource = self; 
self.tableView.delegate = self; 

[self.view addSubview:self.tableView]; 


// Add a search bar to the header 
self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.screenWidth, 44)]; 
self.searchBar.tintColor = [UIColor primaryBrandedColor]; 
self.searchBar.placeholder = NSLocalizedString(@"Search", "Search placeholder"); 
self.searchBar.backgroundImage = [UIImage imageNamed:@"searchBarBackground"]; 
[self.searchBar setBackgroundImage:[UIImage imageNamed:@"searchBarBackground"] forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault]; 
self.searchBar.barTintColor = [UIColor clearColor]; 
self.searchBar.delegate = self; 

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"Whitney-Light" size:15]]; 

//Setup search display controller 
self.searchController = [[HUMSearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self]; 
self.searchController.delegate = self; 
self.searchController.searchResultsDataSource = self; 
self.searchController.searchResultsDelegate = self; 
self.searchController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone; 

// Add the searchBar and offset the table view so it's hidden by default. 
self.tableView.tableHeaderView = self.searchBar; 
self.tableView.contentOffset = CGPointMake(0.0, self.searchBar.frame.size.height); 

Non sembra come niente è fuori dal comune qui, ma c'è un gap 20px sul Tableview originale quando viene visualizzato SearchDisplayController. In questo esempio ho sottocloppato SearchDisplayController per non nascondere il NavigationBar per rendere più chiaro cosa sta succedendo.

Gap

una cattura video della transizione: http://cl.ly/0y3L0Z1R1I0c/20pixels.mov

Le cose che ho provato:

  1. Cambiare la cornice della mia UITableView su searchDisplayControllerWillBeginSearch per spostarlo in alto 20px. Questo rompe la transizione. http://cl.ly/033q0L3G0p1T/origin.mov
  2. Modificare gli offset di scorrimento su UITableView su searchDisplayControllerWillBegin. Allo stesso modo, questo interrompe la transizione.
  3. Ho cercato di animare manualmente UISearchBar ma non sono riuscito a farlo funzionare.

Qualche idea?

risposta

3

Dopo diverse sessioni di prova ed errore, ho raggiunto il comportamento desiderato. Nota nel mio caso quando si fa clic sulla barra di ricerca, voglio spingere la barra di navigazione verso l'alto. La seguente soluzione risolve il problema del gap 20px.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    ...   
    self.edgesForExtendedLayout = UIRectEdgeTop; 
    self.searchBar.clipsToBounds = YES; 
    self.navigationController.navigationBar.translucent = YES; 
} 

Sulla viewWillDisappear proprietà traslucido deve essere impostato a NO, al contrario nella vista segue controllori barra di navigazione rimane spinto insieme al contenuto vista.

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [self resignFirstResponder]; 
    self.navigationController.navigationBar.translucent = NO; 
} 

Spero che questo aiuti.

+1

SÌ! Questo mi ha infastidito così tanto! Grazie! – DonnaLea

+2

Per la stessa soluzione senza fare la barra di navigazione traslucido, utilizzare il seguente: 'self.edgesForExtendedLayout = UIRectEdgeAll;' ' self.automaticallyAdjustsScrollViewInsets = NO;' ' self.extendedLayoutIncludesOpaqueBars = YES;' – BreadicalMD

+0

BreadicalMD: Brilliant! mi hai salvato. Grazie. –

0

\ me waves at Aaron

Questo è ciò che finì a lavorare per noi dopo un inferno di un sacco di sbattere la testa contro il muro. Si noti che stiamo mantenendo la barra di navigazione visualizzata con la barra di ricerca.

Nota: Questo è più probabile che a rompere su iOS 8 poiché va vista subacquee basata su alcune cose ho capito utilizzando Reveal, quindi se qualcuno ha un soluzione meno fragile, mi piacerebbe sentirlo.

- (UIView *)wrapperViewForTableView:(UITableView *)tableView 
{ 
    //This was discovered via Reveal. May change for iOS 8. 
    return tableView.subviews[1]; 
} 

- (CGFloat)statusBarHeight 
{ 
    return CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]); 
} 

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller 
{ 
    //Don't animate - this bit works without animation. 
    UIView *wrapperView = [self wrapperViewForTableView:self.tableView]; 
    CGRect frame = wrapperView.frame; 
    frame.origin.y -= [self statusBarHeight]; 
    frame.size.height += [self statusBarHeight]; 

    wrapperView.frame = frame; 
} 

- (void)searchDisplayControllerWillEndSearch:(HUMSearchDisplayController *)controller 
{ 
    //Animate this so it goes with the dismissal. 
    [UIView animateWithDuration:0.25 animations:^{ 
     UIView *wrapperView = [self wrapperViewForTableView:self.tableView]; 
     CGRect frame = wrapperView.frame; 
     frame.origin.y += [self statusBarHeight]; 
     frame.size.height -= [self statusBarHeight]; 
     wrapperView.frame = frame; 
    }]; 
} 
0

Invece di assegnare il tuo UISearchBar direttamente come tableHeaderView, creare un vuoto UIView con la stessa dimensione della UISearchBar e aggiungere la UISearchBar come una visualizzazione secondaria a questo punto di vista, che si assegna come il tableHeaderView.

Ciò impedirà allo UITableView di essere premuto verso il basso quando lo UISearchBar inizia la modifica.