2010-04-14 15 views
24

Ich habe meine Zeilenhöhe UITableView in Interface Builder auf 54.0 gesetzt. Ich habe eine UISearchDisplayController auf dieser Ansicht. Wenn der Benutzer auf die Suchleiste klickt, wird die Größe der Tabelle korrekt angepasst. Wenn sie jedoch anfangen zu tippen (und tatsächlich die Suche durchführt), nimmt die Zeilenhöhe ab. Es bleibt falsch, bis die Suche antippt Abbrechen.UISearchDisplayController Zeilenhöhe ändern

Ich konnte keine Dokumentation zu diesem Verhalten auf der Website von Apple finden.

Ich habe versucht, die Zeilenhöhe in UISearchDisplayDelegate Delegate Anrufe einzustellen. Dies könnte der richtige Ansatz sein, aber ich kenne die Details nicht und konnte es nicht zum Laufen bringen.

Ich habe auch versucht, - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; zu implementieren. Das hat funktioniert, aber ich habe Tausende von Einträgen in dieser Liste und kann die Leistung nicht schlagen.

Was ist der richtige Weg, um das zu beheben?

+0

Ich würde jedem empfehlen, sich Steven's Antwort unten anzuschauen. Er ist die einzige Antwort, die a) dem 'UITableViewDataSource'-Protokoll folgt, das' UISearchTableView' wie jede andere Tabelle behandelt und b) mehr als eine einzelne Höhe für Zeilen unterstützt. B ist eher wichtig, wenn Sie über die Standardfunktionalität verfügen, um eine benutzerdefinierte Zelle "Keine Suchergebnisse" anzuzeigen, die normalerweise so dimensioniert ist, dass sie den gesamten TableView-Frame aufnimmt. – memmons

+0

Ich bezweifle, dass das stimmt. Ich fand die Implementierung von 'heightForRowAtIndexPath' für mich in diesem Fall, es war nur langsam für meine Tabelle (die Zehntausende von Zeilen hatte). Stellen Sie sicher, dass Sie nur für bestimmte 'tableView'-Parameter keine variable Höhe zurückgeben, und Sie sollten in Ordnung sein. –

+0

'heightForRowAtIndexPath' sollte niemals einen signifikanten Einfluss auf die 'tableView'-Leistung haben. Unabhängig davon, ob Sie 10 Zeilen oder 10.000 Zeilen haben, behandelt das TableView nur die aktuell sichtbaren Zeilen. Wenn Sie also nicht viel Zeit aufwenden, um festzustellen, wie hoch die Zeilenhöhe sein soll, sollte Ihr TableView beim Scrollen eine 60fps-Animation beibehalten können. – memmons

Antwort

55

Der richtige Weg, dies zu tun ist, den folgenden Vertreter zu verwenden.

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView 
{ 
    tableView.rowHeight = 54.0f; // or some other height 
} 

Es wird aufgerufen, wenn UITableView erstellt oder angezeigt wird.

Wenn Sie searchDisplayController.searchResultsTableView in anderem Code aufrufen, wenn eine Suche nicht ausgeführt wird, erstellt es das UITableView im Voraus. Wenn Sie die Delegatenmethode willShow verwenden, um die festzulegen, wird das Timing (aus irgendeinem Grund) fehlen, um die rowHeight zu ändern, wenn das TableView zuvor erstellt wurde.

+0

Ich schäme mich, wie oft ich die akzeptierte Antwort hier verschieben musste, aber Sie sind offensichtlich richtig. Danke. –

+0

Danke Es funktioniert –

0

Sie benötigen beide

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {  
    return 54.; 
} 

und

self.tableView.rowHeight = 54.; 

auch in Ihrem UISearchDisplayDelegate setzen

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView { 
    tableView.rowHeight = 54.; 
} 

Andernfalls, wenn "Keine Ergebnisse" bei der Suche passiert ist, wird Zellenhöhe fallen Zurück zum Standard.

+0

Eigentlich verhalten sich heightForRowAtIndexPath: und .rowHeight ein wenig anders (zumindest in Ihrem Fall), also stellen Sie sicher, dass Sie beide setzen, nicht nur eine davon. – digdog

+0

Ich kann heightForRowAtIndexPath nicht verwenden. Mit 20.000 Zeilen verlangsamt es die Tisch viel zu viel auf einem echten Gerät –

16

Ich habe es gefunden!

Annahme, daß die Tabelle in tableView gespeichert:

- (void)viewDidLoad; 
{ 
    [super viewDidLoad]; 
    self.searchDisplayController.searchResultsTableView.rowHeight = tableView.rowHeight; 
} 

Nichts anderes notwendig ist.

Edit: Siehe netmikey die Antwort für eine bessere Lösung.

10

Steve, Ihre Lösung funktionierte nicht für mich: Das erste Mal würde das Suchergebnis gut angezeigt, aber wenn ein Benutzer "Abbrechen" (schließen Sie die Suchleiste) und dann wieder öffnen und einen Suchbegriff eingeben darin wäre die Höhe wieder falsch.

DigDogs Lösung der Verwendung von funktionierte irgendwie, aber Benutzer sahen die Zellenhöhe "springen", als die Suche begann.

Die Lösung, die ich gefunden, dass diese Probleme behoben beides mit:

- (void)searchDisplayController: (UISearchDisplayController *)controller 
willShowSearchResultsTableView: (UITableView *)searchTableView { 

    searchTableView.rowHeight = myTableView.rowHeight; 
} 

... im UISearchDisplayDelegate.

Grüße, netmikey

+0

Das ist eine bessere Antwort. Akzeptiert. :) –

-1

Keine der Lösungen für mich gearbeitet ...

mein eigenes Did Hit und Versuch ... und habe es funktioniert ...

Wenn Sie unterschiedliche wollen Zeilenhöhen für normale & Tabellenansichten suchen ...

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
// for normal results 
    if (tableView==self.tableView) return 54; 
// for search results 
    else return 54; } 

Und wenn Sie gemeinsame Höhe wollen ...

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return 54; } 

PS: Halten Sie daran, wenn Sie für jede Zeile gleiche Zeilenhöhe haben, ist diese Methode nicht klug, sehr effiziente Ressourcennutzung ist, Da die Zeilenhöhe für jede Zelle neu berechnet wird ... Obwohl dies in den meisten Fällen nicht bemerkt wird, suche ich immer noch nach einer besseren Lösung!

1

Überschreiben der Methode didLoadSearchResultsTableView sollte den Trick tun.

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView { 
    tableView.rowHeight = 82.0; // Change height of search result row 
} 

Weitere Erklärung von this blog

3

In viewDidLoad:

können Sie die Suchanzeigesteuerung des Delegaten selbst gesetzt:

- (void)viewDidLoad 
{ 
    self.searchDisplayController.delegate = self; 
} 

Dann die Tabellenansicht Delegat in Ihrer Ansicht implementieren Controller:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (tableview == self.searchDisplayController.tableView) { 
     return 55; 
    } else if (tableView == self.tableView) { 
     return 44; 
    } 
} 
+0

Ich kann das nicht genug geben Dies ist die einzige Antwort, die a) folgt dem 'UITableViewDataSource'-Protokoll, behandelt die' UISearchTableView' wie jede andere Tabelle und b) Unterstützt mehr als eine einzelne Höhe für Zeilen. B ist eher wichtig, wenn Sie über die Standardfunktionalität verfügen, um eine benutzerdefinierte Zelle "keine Suchergebnisse" anzuzeigen, die normalerweise so dimensioniert ist, dass sie den gesamten TableView-Frame aufnimmt. – memmons

0

Ich habe ios 7.0 und Xcode 5.0 verwendet. Ich glaube, Sie sollten Sie Höhe in dieser Methode der Zeile ändern:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    { 
    // Return the number of rows in the section. 
    if (tableView == self.searchDisplayController.searchResultsTableView) 
    { 
     tableView.rowHeight = ...;// change your row height here! 
     return [self.searchResults count]; 
    } 
    else 
    { 
     ... 
     return ...; 
    } 
    } 

Weil jedes Mal, wenn ein Tableview Versuch sein Layout angezeigt werden, diese Methode aufgerufen wird, so jedes Mal wenn Sie einen Brief in Suchleiste eingeben, wird diese Methode aufgerufen, und die Zeilenhöhe wird keine Chance haben, sich zu ändern.