Ich habe den Interface Builder verwendet, um eine Tabellenansicht zu erstellen, zu der ich die Suchleiste und den Search Display Controller der Bibliothek hinzugefügt habe, um Suchfunktionen hinzuzufügen. IB hat es jedoch so eingerichtet, dass die Leiste oben auf dem Bildschirm sichtbar ist, wenn die Ansicht zum ersten Mal angezeigt wird.
Ich möchte wissen, wie die Suchleiste standardmäßig ausgeblendet wird, aber dennoch mit der Tabellenansicht gescrollt werden kann (ein Beispiel finden Sie in der Mail-Anwendung von Apple). Ich habe versucht Aufruf scrollRectToVisible:animated:
in viewDidLoad
die Tabellen - Ansicht nach unten scrollen , aber ohne Erfolg. Was ist die bevorzugte Methode, um die Suchleiste standardmäßig auszublenden?
contentOffset
mit einem beliebigen Wert wird unterbrochen, wenn Sie ein komplexes View-Controller-Layout verwenden. Ich empfehle es nicht.Fügen Sie die UISearchBar nicht als Unteransicht der UITableView hinzu, dies ist nicht erforderlich.
Die UITableView verfügt über eine tableHeaderView-Eigenschaft, die dafür perfekt geeignet ist:
Wenn Sie es nicht standardmäßig sehen möchten:
Ich bekomme auch die Schaltfläche Abbrechen, um es wieder auszublenden .... (und entfernen Sie die Tastatur)
quelle
viewWillAppear
einzufügen ist eine schlechte Idee, da es jedes Mal ausgeführt wird, wenn Sie zurück zu Ihrer Ansicht navigieren. Dies bedeutet, dass Ihre Tabellenansicht langsam nach unten geht. Irritierender Bug!Das contentOffset wurde in den Kommentaren von Tim und Joe D'Andrea vermerkt, dies wird jedoch durch Hinzufügen einer Animation zum Ausblenden der Suchleiste etwas erweitert. Mir ist aufgefallen, dass es etwas unerwartet ist, dass die Suchleiste einfach verschwindet.
Versuchen Sie Folgendes, ein kleines Update für diejenigen, die auf iOS 4.0 und höher abzielen möchten:
Vorherige Antwort:
quelle
viewDidAppear:
stattdessen implementierenviewDidLoad
.Es gibt viele Antworten auf diese Lösung, aber keine hat für mich sehr gut funktioniert.
Das funktioniert perfekt. Keine Animation und wird erledigt
-viewDidLoad
Hinweis:
Code setzt voraus, dass Sie das haben,
searchBar
@property
was mit der Suchleiste verknüpft ist. Wenn nicht, können Sieself.searchDisplayController.searchBar
stattdessen verwendenquelle
-viewWillAppear
es nicht funktioniert. Wird es aufgerufen, wenn der Tab-Controller zur Ansicht wechselt?Für Swift 3+
Ich war das:
Erklären Sie dies
var
:Und in der
viewDidLoad()
Methodequelle
Mein Ziel war es, die zu tableHeaderView hinzugefügte Suchleiste des einfachen TableView-Stils im Storyboard auszublenden, wenn der View-Controller geladen ist, und die Leiste anzuzeigen, wenn der Benutzer oben in UITableView nach unten scrollt. Also benutze ich Swift und habe eine Erweiterung hinzugefügt:
In viewDidLoad () rufen Sie einfach auf:
quelle
Alle vorhandenen Lösungen funktionieren unter iOS 8 nicht, wenn nicht genügend Zeilen vorhanden sind, um die Tabellenansicht zu füllen, da iOS den Einschub in dieser Situation automatisch anpasst. (Bestehende Antworten sind gut, wenn genügend Zeilen vorhanden sind.)
Nachdem ich ungefähr 6 Stunden mit diesem Problem verschwendet hatte, bekam ich endlich diese Lösung.
Kurz gesagt, Sie müssen leere Zellen in die Tabellenansicht einfügen, wenn nicht genügend Zellen vorhanden sind. Daher ist die Inhaltsgröße der Tabellenansicht groß genug, damit iOS den Einschub nicht für Sie anpasst.
So habe ich es in Swift gemacht:
1.) Deklarieren Sie eine Variable
minimumCellNum
als Klasseneigenschaft2.) berechnen
minimumCellNum
und SETtableView.contentOffset
inviewWillAppear
3.) in
tableView(tableView: UITableView, numberOfRowsInSection section: Int))
4.) Registrieren Sie eine leere Zelle mit dem
selection
AttributNone
im Storyboard und intableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
5.) in
tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
Dies ist keine perfekte Lösung, aber es ist die einzige Problemumgehung, die unter iOS 8 wirklich für mich funktioniert. Ich würde gerne wissen, ob es eine bessere Lösung gibt.
quelle
Keiner der oben genannten Punkte hat bei mir funktioniert, also nur für den Fall, dass jemand das gleiche Problem hat.
Ich habe
searchBar
wietableHeaderView
auf einer gruppierten Tabelle unter iOS7 eingestellt. InviewDidLoad
Ich habetableView.contentOffset = CGPointMake(0, 44);
zu haltensearchBar
zunächst „versteckt“. Wenn der Benutzer einensearchBar
Bildlauf nach unten durchführt, wird dies angezeigtTor: Suchleiste beim Tippen auf die Schaltfläche Abbrechen ausblenden
Im
searchBarCancelButtonClicked(searchBar: UISearchBar!)
Dies funktionierte nicht:
[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
tableView scrollte zu stark nach oben, was dazu führte, dass Zeile 0 hinter toolBar stand.Das hat nicht funktioniert:
tableView.ContentOffset = CGPointMake(0, 44)
- nichts passiertDas hat nicht funktioniert:
tableView.ContentOffset = CGPointMake(0, searchBar.frame.size.height)
- nichts passiertDies funktionierte nicht:
tableView.setContentOffset(CGPointMake(0, 44), animated: true);
Auch hier scrollte tableView zu stark nach oben, was dazu führte, dass Zeile 0 hinter toolBar stand.Dies funktionierte teilweise: ging
tableView.setContentOffset(CGPointMake(0, 0)
abertitleForHeaderInSection
hinter toolBarDAS ARBEITETE:
tableView.setContentOffset(CGPointMake(0, -20)
Scheint nicht logisch, aber nur -20 hat es in die richtige Position gebracht
quelle
CGRectGetHeight(searchBar.bounds)
?ContentOffset
funktioniert keine der LösungenContent Offset ist der richtige Weg, funktioniert aber nicht 100% der Zeit.
Es funktioniert nicht, wenn
estimatedRowHeight
eine feste Zahl eingestellt ist. Ich kenne die Arbeit noch nicht. Ich habe ein Projekt mit den Problemen erstellt und mit Apple ein Radar erstellt .Schauen Sie sich das Projekt an, wenn Sie schnell ein Beispiel für die Einrichtung wünschen.
quelle
Beachten Sie, dass die akzeptierte Antwort abstürzt, wenn die Tabellenansicht keine Daten enthält. Das Hinzufügen zu viewDidLoad funktioniert unter bestimmten Umständen möglicherweise nicht.
Fügen Sie stattdessen diese Codezeile hinzu:
quelle
Ehrlich gesagt, keine der Antworten hat das Problem wirklich gelöst (für mich). Wenn Ihre Tabellenansicht keine Zeilen enthält ODER die Zeilenhöhe unterschiedlich ist, reichen diese Antworten nicht aus.
Das einzige was funktioniert:
quelle
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
.Die
scrollToRowAtIndexPath
Methode verursacht einen Absturz, wenn die Tabelle keine Zeilen enthält.UITableView ist jedoch nur eine Bildlaufansicht, sodass Sie den Inhaltsversatz einfach ändern können.
Dadurch wird überprüft, ob Sie etwas als tableHeaderView haben, und es wird davon ausgegangen, dass Sie einen Bildlauf durchführen, um es auszublenden
quelle
Ich finde, dass die App "Notizen" keine Elemente suchen kann, wenn die Tabellenansicht leer ist. Also ich denke es benutzt nur
-(void)addSubview:(UIView *)view
, um eine leere Tabelle hinzuzufügen. Wenn Sie ein Element zu seinem Datenquellenarray hinzufügen, wird ein weiteres Stück Code ausgeführt, um tableView zu laden.Meine Lösung lautet also:
Hoffe das hilft :-)
quelle
Ändern Sie die Grenzen der tableView. Dies kann innerhalb
viewDidLoad
der Tabelle erfolgen. Außerdem müssen Sie sich keine Gedanken darüber machen, ob die Tabelle leer ist oder nicht (um die Ausnahme zu vermeiden).Sobald der Benutzer in der Tabelle gescrollt hat, wird die Suchleiste angezeigt und verhält sich normal
quelle
Die anderen Antworten auf diese Frage funktionierten entweder überhaupt nicht, hatten ein merkwürdiges Verhalten, wenn die tableView 0 Zeilen hatte, oder sie haben die Bildlaufposition beim Hin- und Herwechseln zwischen übergeordneten und verschachtelten Werbebuchungen durcheinander gebracht. Dies hat bei mir funktioniert (das Ziel war es, die UISearchBar beim Laden auszublenden):
Erläuterung
Immer das
tableView
erscheint, ist dieser Code überprüft, ob die UISearchBar sichtbar ist (dh diey
Position dercontentOffset
, auch bekannt als Scroll - Position ist0
). Wenn dies der Fall ist, wird einfach die Höhe der Suchleiste nach unten gescrollt. Wenn die Suchleiste nicht sichtbar ist (denken Sie an eine größere Liste von Elementen intableView
), wird nicht versuchttableView
, durch die Suchleiste zu scrollen , da dies die Positionierung beeinträchtigen würde, wenn Sie von einer verschachtelten Werbebuchung zurückkehren.Randnotiz
Ich würde empfehlen, diesen Code in eine separate Methode einzufügen, um die Einzelverantwortung sicherzustellen und Ihnen die Wiederverwendbarkeit zu geben, ihn jederzeit in Ihrem Code aufzurufen.
quelle
Wenn Ihre Tabelle immer mindestens eine Zeile enthält, scrollen Sie einfach zur ersten Zeile der Tabelle, und die Suchleiste wird automatisch ausgeblendet.
self.tableView.selectRowAtIndexPath (firstIndexPath, animiert: false, scrollPosition: .Top)
Wenn Sie den obigen Code in viewDidLoad einfügen , wird ein Fehler ausgegeben , da die tableView noch nicht geladen wurde. Sie müssen ihn daher in viewDidAppear einfügen, da die tableView zu diesem Zeitpunkt bereits geladen ist.
Wenn Sie es auf viewDidAppear platzieren , wird es bei jedem Öffnen der tableView nach oben gescrollt.
Möglicherweise möchten Sie dieses Verhalten nicht, wenn die tableView geöffnet bleibt, z. B. wenn es sich um einen UITabBar View Controller handelt oder wenn Sie einen Übergang durchführen und dann zurückkehren. Wenn Sie nur möchten, dass es beim ersten Laden nach oben gescrollt wird, können Sie eine Variable erstellen, um zu überprüfen, ob es sich um ein anfängliches Laden handelt, sodass es nur einmal nach oben scrollt.
Definieren Sie zuerst eine Variable namens isInitialLoad in der View Controller-Klasse und setzen Sie sie auf "true":
Überprüfen Sie dann, ob isInitialLoad in viewDidAppear true ist. Wenn dies der Fall ist, scrollen Sie nach oben und setzen Sie die Variable isInitialLoad auf false:
quelle
Der folgende Code funktioniert für mich
quelle
Ich habe versucht, den Inhaltsoffset und den scrollToIndexpath festzulegen, aber nichts hat zufriedenstellend funktioniert. Ich habe die Einstellung von tableHeaderView als searchBar aus viewDidLoad entfernt und sie wie unten in scrollview delegate festgelegt
Dies funktionierte wie ein Zauber. Die Einstellung für den Inhaltsversatz dient dem reibungslosen Scrollen
quelle
Vergessen Sie nicht, die Statusleiste und die Navigationsleiste zu berücksichtigen. Mein Table View Controller ist in einen Navigationscontroller eingebettet in
viewDidAppear
:arbeitete für mich.
quelle
Für Swift:
Machen Sie einfach den Inhalt der Tabellenansicht y versetzt, was der Höhe der Suchleiste entsprechen sollte.
quelle
Swift 3
funktioniert auch mit leerem Tisch!
In meiner Umgebung lade ich benutzerdefinierte Zellen per XIB-Datei und die Zeilenhöhe wird automatisch festgelegt.
quelle
Ich hatte ein ähnliches Problem. Die einzige Möglichkeit, dieses Problem zu lösen, bestand darin, einen Schlüsselwertbeobachter für die Eigenschaft UITableView contentOffset zu verwenden.
Nach einigem Debuggen wurde mir klar, dass das Problem nur auftritt, wenn der Inhalt der Tabellenansicht kleiner als die Tabellenansicht ist. Ich starte KVO, wenn ich auf viewWillAppear bin. Und Versandstopp KVO 0,3 Sekunden nach Erscheinen der Ansicht. Jedes Mal, wenn contentOffset auf 0.0 gesetzt wurde, reagiert KVO und setzt contentOffset auf die Höhe der Suchleiste. Ich stoppe KVO asynchron nach 0,3 Sekunden, da das Ansichtslayout contentOffset auch nach dem Anzeigen der Ansicht zurücksetzt.
quelle