web-dev-qa-db-ger.com

Scrollen Sie zum Anfang von UITableView, indem Sie auf die Statusleiste tippen

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?

57
Chase

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.

148
Mark Granoff

Wenn Sie von Google kamen und eine vollständige Checkliste benötigen:

  1. Stellen Sie sicher, dass Sie in Ihrem UITableView scrollsToTop = YES (Vorschlag von Mark) festgelegt haben
  2. Stellen Sie sicher, dass Sie für alle OTHER UITableViews/UIScrollViews/UITextViews in Ihrem Fenster scrollsToTop = NO festgelegt haben, damit der Klick nicht unterbrochen wird. Ich habe viele Ansichten in meinem Fenster ausgedruckt, um das zu debuggen ...
  3. Stellen Sie sicher, dass sich Ihre Tabellenansicht im Fenster auf 0/0 (x/y-Koordinaten) befindet. Auf diese Weise weiß das System, dass es die Nachricht weiterleiten soll
31
Zane Claes

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!

6
Brandon Roberts

Ich hatte das gleiche Problem, wurde aber durch folgende Schritte behoben:

  1. Setzen Sie scrollsToTop = YES für die Tableview, die Sie nach oben scrollen möchten.
  2. sets scrollsToTop = NO für alle anderen TableView-, Collection- oder Scrollview-Ansichten.
  3. Wenn eine Ihrer Tableview-Zellen über eine Sammlungsansicht verfügt. Stellen Sie sicher, dass Sie scrollsToTop auch für die Sammlungsansicht auf NO setzen.

Wenn Ihr View Controller/Navigations-Controller einem anderen View Controller als Unteransicht hinzugefügt wird, müssen Sie ihn als untergeordneten Controller festlegen.

6
iOS Developer

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.

2
DennyLou

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.

2
George

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 von shouldScrollViewScrollToTop zurück nicht schon oben . // Auf dem iPhone führen wir diese Geste nur aus, wenn eine Bildlaufansicht mit scrollsToTop == YES auf dem Bildschirm angezeigt wird. Wenn mehr als eine gefunden wird, wird keine gescrollt.

1
foskon

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.

0
Géza Mikló

Zum Beispiel, wenn Sie eine Tabellenansicht und eine Bildlaufansicht wie Tags wie diese haben

 enter image description here

sie sollten so etwas in viewDidLoad machen

self.tableView.scrollsToTop = true
self.tagsView.scrollsToTop = false
0
Abo3atef