Ich weiß, dass es eine Menge Code gibt, um eine Tabellenansicht nach oben zu scrollen, aber ich möchte dies tun, wenn die obere Statusleiste angeklickt wird, genau wie in Apples nativen Apps. Ist das möglich?
Sie erhalten dies kostenlos, sollten jedoch überprüfen, dass das scrollsToTop
-Attribut Ihrer UITableView
den Wert YES hat.
Wenn dies NICHT funktioniert, ist es, wenn Sie ein UIScrollView
(oder eine abgeleitete Klasse wie UITextView) in eine andere UIScrollView
-Klasse (wie UITableView
) eingebettet haben. In diesem Fall setzen Sie scrollsToTop
für die eingebettete UIScrollView
-Klasse auf NO. Dann funktioniert das Verhalten der Statusleiste.
Wenn Sie von Google kamen und eine vollständige Checkliste benötigen:
Mit den Informationen aus anderen Antworten habe ich meinem UITableViewController den folgenden Code hinzugefügt, damit er funktioniert:
- (void) viewDidLoad { [super viewDidLoad]; für (UITextView * -Ansicht in self.view.subviews) { if ([view isKindOfClass: [UITextView-Klasse]]) { view.scrollsToTop = NO; } } self.tableView.scrollsToTop = YES; }
Dadurch werden alle Ansichten in der UITableViewController-Hierarchie durchgesehen und in allen UITextViews, die das Touch-Ereignis abgefangen haben, scrollsToTop deaktiviert. Dann wurde sichergestellt, dass das tableView immer noch die Berührung erhalten würde.
Sie können dies ändern, um andere UITableViews/UIScrollViews/UITextViews zu durchlaufen, die möglicherweise ebenfalls abgefangen werden.
Hoffe das hilft!
Ich hatte das gleiche Problem, wurde aber durch folgende Schritte behoben:
Wenn Ihr View Controller/Navigations-Controller einem anderen View Controller als Unteransicht hinzugefügt wird, müssen Sie ihn als untergeordneten Controller festlegen.
Ich weiß, dass dies ein ziemlich alter ist, aber ich hoffe, dass dies helfen kann. Nach dem, was @MarkGranoff gesagt hat, funktioniert das scrollsToTop nicht, wenn für mehr als eine UIScrollView-Klasse oder ihre Unterklassen YES (Standardwert) festgelegt wurde. Es ist wahrscheinlich eine Überprüfung des Werts wert, zu prüfen, wer dieses Verhalten tatsächlich durcheinander bringt. Die unten beschriebene einfache Methode durchläuft die Unteransichten Ihrer Ansicht und protokolliert den scrollsToTop-Wert aller UIScrollView in Ihrer Ansicht. Vorzugsweise in Ihrer viewDidAppear-Methode aufgerufen werden.
- (void)checkForScrollViewInView:(UIView *)view {
for (UIView *subview in [view subviews]) {
if ([subview isKindOfClass:[UIScrollView class]]) {
NSLog(@"scrollsToTop enabled: %i in scroll view %@", ((UIScrollView *)subview).scrollsToTop, subview);
}
if (subview.subviews.count > 0) {
[self checkForScrollViewInView:subview];
}
}
}
Dies ist in der Tat nur ein Debug-Code. Wenn Sie den Wert für scrollsToTop für jede UIScrollView-Unterklasse gefunden haben, stellen Sie sicher, dass nur eine auf YES gesetzt ist.
Wie Mark bereits erwähnt hat, kann es nur eine Unterklasse von UIScrollView geben (normalerweise die Tabellensicht), für die die Eigenschaft scrollsToTop auf TRUE gesetzt ist. Wahrscheinlich haben Sie andere, normalerweise UITextView in Ihrer Ansicht. Setzen Sie einfach die scrollsToTop -Eigenschaft auf FALSE, und Sie können loslegen.
In der UIScrollView-Headerdatei:
// Wenn der Benutzer auf die Statusleiste tippt, wird die Bildlaufansicht unterhalb der Berührung, die der Statusleiste am nächsten ist, nach oben gescrollt. Wenn jedoch die
scrollsToTop
-Eigenschaft YES ist, gibt der Delegat kein NEIN vonshouldScrollViewScrollToTop
zurück nicht schon oben . // Auf dem iPhone führen wir diese Geste nur aus, wenn eine Bildlaufansicht mitscrollsToTop
== YES auf dem Bildschirm angezeigt wird. Wenn mehr als eine gefunden wird, wird keine gescrollt.
Es können mehrere UIScrollView-Nachkommen vorhanden sein geladen werden, z.
Die Eigenschaft scrollsToTop ist standardmäßig true .
Neben der Verarbeitung der verschachtelten UIScrollViews-Eigenschaft scrollsToTop sollten Sie außerdem Folgendes tun:
//When the view is loaded disable scrollsToTop, this view may not be the visible one
override func viewDidLoad() {
super.viewDidLoad()
...
tableView.scrollsToTop = false
}
//Now it's time to enable scrolling, the view is guaranteed to be visible
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tableView.scrollsToTop = true
}
//Do not forget to disable scrollsToTop, making other visible UIScrollView descendant be able to be scrolled to top
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.tableView.scrollsToTop = false
}
Auf diese Weise wird nur ein scrollsToTop der obersten Ebene von UITableView auf true gesetzt.