2014-02-19 7 views
13

Ich habe eine UITableViewController T, die eine UISearchDisplayController und UISearchBar in der üblichen Weise enthält (alles in einer Feder definiert). T wird dann von einem anderen View-Controller standardmäßig als Child-View-Controller enthalten.UISearchBar bewegt sich um 20 Pixel

Die Suchleiste richtig angezeigt wird:

normal search bar

Aber als ich in die Suchleiste tippen Sie suchen tatsächlich erhält der Suchleiste größer, und der Inhalt in der Suchleiste fällt nach unten, was aussieht etwa 20 Pixel (er, die Höhe der Statusleiste Zufall?) Wie so:

weird search bar is too tall

Was ist da los? Es ist zu groß. Auch die Animation, die es so aussehen lässt, ist unbeholfen. Irgendeine Möglichkeit, dieses unansehnliche Wachstum zu verhindern?

+1

Ich habe dieses Problem mit 'UISearchController' erinnern Sie sich, wenn/wie Sie es behoben? – AnthonyM

Antwort

7

ich es geschafft, ein sehr ähnliches Problem, das dem von Ihnen auftreten programmatisch die UISearchController wie so up Einstellung zu lösen:

Hinweis ~ Die Fehler, wenn hidesNavigationBarDuringPresentation bleibt auf NO nicht gesetzt.

#pragma mark - View Life Cycle 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.results = [[NSArray alloc] init]; 

// 1 \\ Results Table View 
    UITableView *searchResultsTableView = [[UITableView alloc] initWithFrame:self.tableView.frame]; 
    [searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:Identifier]; 
    searchResultsTableView.delegate = self; 
    searchResultsTableView.dataSource = self; 

// 2 \\ init search results table view & setting its table view 
    self.searchResultsTableViewController = [[UITableViewController alloc] init]; 
    self.searchResultsTableViewController.tableView = searchResultsTableView; 
    self.searchResultsTableViewController.view.backgroundColor = [UIColor blackColor]; 

// 3 \\ init a search controller with it's tableview controller for results 
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsTableViewController]; 
    self.searchController.hidesNavigationBarDuringPresentation = NO; // √ 
    self.searchController.searchResultsUpdater = self; 
    self.searchController.delegate = self; 
    self.searchController.searchBar.barTintColor = [UIColor blackColor]; 

// 4 \\ Make an appropriate search bar (size, color, attributes) and add it as the header 
    [self.searchController.searchBar sizeToFit]; 
    self.tableView.tableHeaderView = self.searchController.searchBar; 
    self.tableView.tableHeaderView.backgroundColor = [UIColor blackColor]; 

// 5 \\ Enable presentation context 
    self.definesPresentationContext = YES; 
    self.tableView.backgroundColor = [UIColor clearColor]; 
    self.currentUser = [PFUser currentUser]; 
} 

Hinzugefügt Weitere Details:

  1. Interface Builder: UIViewController (nicht UITableViewController)
  2. ein UITableView mit Constraints hinzufügen:

    a. enter image description here

    b. * My Navigationsleiste ist benutzerdefinierte Höhe - Ihr „Top Space: Top-Layout Guide“ kann

  3. Fügen Sie die Delegierten & Datenquelle Stellen aus der addierten Tabellenansicht auf die UIViewController

    geändert wird ein . Vergessen Sie nicht, so programmatisch zu tun:

    @interface AddUsersViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 
    
    @property (weak, nonatomic) IBOutlet UITableView *tableView; 
    
  4. In Ihrer Interface Extension:

    ein. Stellen Sie Ihren UISearchConroller ‚s Delegierten und Datenquelle:

    #import "AddUsersViewController.h" 
    
    #define ResultsTableView self.searchResultsTableViewController.tableView 
    #define Identifier @"Cell" 
    
    @interface AddUsersViewController() <UISearchControllerDelegate, UISearchResultsUpdating> 
    
    @property (nonatomic) UISearchController *searchController; 
    @property (nonatomic) UITableViewController *searchResultsTableViewController; 
    @property (nonatomic, weak) UIBarButtonItem *leftBarButton; 
    @property (nonatomic) NSArray *results; 
    
    @end 
    

Obwohl dies für mich gearbeitet, ich habe entdeckt, dass es auch andere mögliche Szenarien gibt, die dies verursachen könnte. Mein "Problem" war nicht, dass die Suchleiste um 20px (oder so) nach unten verschoben wurde, sondern dass sie sich nach oben bewegte. Ich schrieb dies einem benutzerdefinierten UINavigationBar-Header zu, der einen Bildtitel und benutzerdefinierte NavBarButtons enthielt. In diesem Sinne sind hier zwei weitere mögliche Lösungen:

.

Original-Szenarien:

  1. Ihre Container Ansicht des extendedLayoutIncludesOpaqueBars Property

    ein. Storyboard: Überprüfen Sie √ "Under Opaque Bars" für die Tabellenansichten im Storyboard.

    b. Programmatisch: yourTableView(s).extendedLayoutIncludesOpaqueBars = JA;

.

  1. Set scopeButtonTitles auf ein leeres Array. (Unten)

    self.searchController = UISearchController(searchResultsController: nil); 
    self.searchController.searchResultsUpdater = self; 
    self.searchController.searchBar.scopeButtonTitles = []; 
    self.tableView.tableHeaderView = self.searchController.searchBar; 
    

Die später zwei Antworten kommen aus THIS Frage und beweisen kann auch bei der Prüfung von Vorteil sein.

Dank der Forschung und Tests von BananaNeil, entdeckte er, dass wenn Sie die meine Empfehlungen befolgen und Ihre searchController.searchBar.y = 0 setzen, Ihre Suchleiste genau da sein sollte, wo Sie gehofft hatten. √

+0

Vielen Dank für die Mühe, die Sie in diese Antwort gesteckt haben. Ich arbeite Ihre Lösungen durch und komme definitiv näher, habe aber immer noch Probleme. Ich werde es als akzeptiert markieren, wenn ich es für mich arbeiten lassen kann. – BananaNeil

+0

Verwenden Sie einen 'UISearchDisplayController' oder einen' UISearchController'? Ersteres war in iOS 8 veraltet und könnte die Ursache des Problems sein. – ChrisHaze

+0

@BananaNeil Ich habe den Code/Arbeit hinzugefügt, die außerhalb der nur von mir gelieferten 'viewDidLoad:' -Methode implementiert wurde. – ChrisHaze

0

Anstatt einen UITableViewController zu verwenden, wählen Sie einen normalen UIViewController aus, und fügen Sie seiner Ansicht einen UITableView hinzu. Fügen Sie Abhängigkeiten hinzu, um sie an Top Layout Guide.Bottom, Superview.Leading, Superview.Trailing, Bottom Layout Guide.Top anzuhängen. Fügen Sie dann das Search Bar zu dem UITableView hinzu.

Aus irgendeinem Grund springt die Suchleiste nicht, wenn sie auf diese Weise implementiert wird.

Ein möglicher Grund könnte sein, dass beim Bearbeiten des Such-Controllers die Position der Suchleiste durch Versetzen der Höhe der oberen Layout-Anleitung angepasst wird. Fixiert man die Tabellenansicht explizit oben auf Top Layout Guide.Bottom hilft irgendwie.

Hoffe, das hilft!

+0

Ich bin mir ziemlich sicher, dass der Search Display Controller veraltet ist. – BananaNeil

+0

Es ist veraltet. Aber da die ursprüngliche Frage es erwähnte, ging ich mit dieser Annäherung voran. –

+0

Aber diese Lösung sollte für Sie auch mit einem UISearchController funktionieren. –

1

Ich habe mein Problem tatsächlich herausgefunden:

ich meine UISearchBar innerhalb einer Hülle Ansicht hatte, die ich war Neupositionierung als gescrollt UITableView.

Der Wrapper war 20px höher als die Suchleiste, und ich setzte searchbar.y = 20 (aus stilistischen Gründen). Jedes Mal, wenn ich auf die Suchleiste klickte, wuchs sie unerklärlicherweise um 20 Pixel.

Irgendwann stellte ich die searchBar.y = 10, und bemerkte, dass es nur um 10px wuchs.

Und tatsächlich, es stellt sich heraus, dass die Wachstumshöhe der searchBar innerhalb ihrer unmittelbaren Superview exakt der y-Position entspricht. Als ich die searchbar.y = 0 einstellte, hörte die Suchleiste auf zu wachsen.

6

nicht sicher, ob dies iOS 9 spezifisch, aber

searchController.hidesNavigationBarDuringPresentation = NO;

löst das Problem der seltsamen Abwärtsbewegung der UISearchBar ganzes enthält UITableView Einstellung. Natürlich deaktiviert die Navigationsleiste - so könnte dies nicht das sein, was Sie wollen.

0

Bitte versuchen Sie es mit:

yourSearchBar.clipsToBounds = true