2014-05-05 8 views
5

Ich implementiere eine UISearchBar auf der Spitze eines UITableView.UISearchBar zu UISearchDisplayController Übergang ist um 20px

In meinem ViewDidLoad habe ich self.edgesForExtendedLayout = UIRectEdgeNone festgelegt.

So füge ich meine UISearchBar hinzu. Ich füge nur einen UISearchBar an den Header meiner UITableView und Einstellen des Gehalts Offset:

// 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); 

Es scheint nicht, wie etwas aus dem Üblichen heraus ist hier, aber es gibt eine 20px Lücke auf dem ursprünglichen Tableview, wenn Der SearchDisplayController wird angezeigt. In diesem Beispiel habe ich SearchDisplayController subclassiert, um die Navigationsleiste nicht zu verbergen, um deutlicher zu machen, was passiert.

Gap

Ein Video-Capture des Übergangs: http://cl.ly/0y3L0Z1R1I0c/20pixels.mov

Die Dinge, die ich versucht habe:

  1. Ändern Sie den Rahmen meines UITableView auf searchDisplayControllerWillBeginSearch es bewegen 20px oben. Dies bricht den Übergang. http://cl.ly/033q0L3G0p1T/origin.mov
  2. Ändern Sie die Scroll-Offsets auf UITableView auf searchDisplayControllerWillBegin. Ähnlich bricht dies den Übergang.
  3. Ich versuchte, die UISearchBar manuell zu animieren, aber ich konnte auch nicht funktionieren.

Irgendwelche Ideen?

Antwort

3

Nach mehreren Versuchs- und Fehlersitzungen erreichte ich endlich das gewünschte Verhalten. Beachten Sie in meinem Fall, wenn die Suchleiste angeklickt wird, möchte ich die Navigationsleiste nach oben geschoben. Die folgende Lösung behebt das 20-Px-Lücke-Problem.

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

On viewWillDisappear die transluzente Eigenschaft muss NO, ansonsten in der Ansicht segue Controller Navigationsleiste werden gesetzt bleibt zusammen mit Inhalt ansehen geschoben.

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

Hoffe, das hilft.

+1

JA! Das nervt mich so sehr! Vielen Dank! – DonnaLea

+2

Für die gleiche Lösung, ohne die Navigationsleiste durchscheinend zu machen, verwenden Sie die folgenden Schritte aus: 'self.edgesForExtendedLayout = UIRectEdgeAll;' ' self.automaticallyAdjustsScrollViewInsets = NO;' ' self.extendedLayoutIncludesOpaqueBars = YES;' – BreadicalMD

+0

BreadicalMD: Brilliant! Du hast mich gerettet. Vielen Dank. –

0

\ me waves at Aaron

Dies ist, was nach einem verdammt viel für uns zu arbeiten Liquidation von meinem Kopf gegen die Wand schlagen. Beachten Sie, dass wir die Navigationsleiste mit der Suchleiste anzeigen lassen.

Hinweis: Dies wird wahrscheinlich auf iOS 8 zu brechen, da es auf der Grundlage einiger Sachen, die ich mit Reveal herausgefunden habe, zu tauchen geht, also wenn jemand eine weniger zerbrechliche Lösung hat, würde ich es gerne hören.

- (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

Statt Ihre UISearchBar direkt als tableHeaderView zuzuweisen, eine leere UIView mit der gleichen Größe wie die UISearchBar erstellen und die UISearchBar als Subview zu dieser Ansicht hinzufügen, die Sie als tableHeaderView zuweisen.

Dies verhindert, dass die UITableView gedrückt wird, wenn die UISearchBar Bearbeitung beginnt.