Przewiń do góry widoku UITableView, dotykając paska stanu

Wiem, że istnieje mnóstwo kodu, aby przewijać widok tabeli do góry, ale chcę to zrobić, gdy górny pasek stanu jest stuknięty, tak jak w natywnych aplikacjach Apple. Czy to możliwe?

Author: Vadim Kotov, 2011-08-23

9 answers

Dostajesz to za darmo, ale powinieneś sprawdzić, czy scrollsToTop atrybut twojego UITableView jest YES.

Kiedy to nie działa, to kiedy masz obiekt UIScrollView (lub klasę potomną, jak UITextView) osadzony wewnątrz innej klasy UIScrollView (Jak UITableView). W tym przypadku ustaw scrollsToTop Na wbudowanej klasie UIScrollView Na NO. Następnie będzie działać zachowanie tap-the-status-bar.

 145
Author: Mark Granoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 07:48:26

Jeśli pochodzisz z Google i potrzebujesz pełnej listy kontrolnej:

  1. Sprawdź, czy Ustawiłeś scrollsToTop=YES (zgodnie z sugestią Marka) na Twoim UITableView
  2. Upewnij się, że ustawiłeś scrollsToTop = NO na wszystkich innych UITableViews / UIScrollViews / UITextViews w oknie, aby nie przechwytywały kliknięcia. Odkryłem, że wiele razy drukuję wszystkie widoki w moim oknie, aby to debugować...
  3. Upewnij się, że widok tabeli jest na 0/0 (współrzędne x/y) w obrębie okno-w ten sposób system wie, że powinien przekazać wiadomość
 31
Author: Zane Claes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 07:49:04

Korzystając z informacji podanych w innych odpowiedziach, dodałem następujący kod do mojego UITableViewController get it to work:

- (void)viewDidLoad
{
    [super viewDidLoad];

    for (UITextView *view in self.view.subviews) {
        if ([view isKindOfClass:[UITextView class]]) {
            view.scrollsToTop = NO;
        }
    }

    self.tableView.scrollsToTop = YES;
}

Przegląda wszystkie widoki w hierarchii kontrolera UITableViewController i wyłącza scrollsToTop dla wszystkich przeglądów UITextView, które przechwytywały Zdarzenie touch. Następnie upewnij się, że tableView nadal będzie otrzymywać dotyk.

Możesz to zmodyfikować, aby przejść przez inne UITableViews / UIScrollViews / UITextViews, które mogą przechwytywać jako cóż.

Mam nadzieję, że to pomoże!
 6
Author: Brandon Roberts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-07 23:10:33

Miałem ten sam problem, ale naprawiony przez następujące kroki:

  1. Ustaw scrollsToTop = YES dla tableview, który chcesz przewijać do góry.
  2. Ustaw scrollsToTop = NO dla wszystkich innych tableview lub collection view lub scrollview.
  3. jeśli którakolwiek z komórek tableview ma widok kolekcji . Upewnij się, że scrollsToTop ma wartość NO również dla widoku kolekcji.

Jeśli kontroler widoku / kontroler nawigacji zostanie dodany jako podgląd podrzędny w innym kontrolerze widoku, upewnij się, że go Ustawiłeś jako kontroler dziecka.

 6
Author: iOS Developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-22 07:26:52

Jak powiedział Mark, możesz mieć tylko jedną podklasę UIScrollView (Zwykle widok tabeli), która ma właściwość scrollsToTop ustawioną na TRUE. Prawdopodobnie masz inne, zazwyczaj UITextView w widoku. Po prostu ustaw ich Właściwość scrollsToTop na FALSE i możesz iść.

 2
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-02 02:55:28

Wiem, że to dość stare, ale mam nadzieję, że to pomoże. Zgodnie z tym, co powiedział @MarkGranoff, scrollsToTop nie działa, jeśli więcej niż jeden UIScrollView, lub jego podklasy, ma ustawione na YES( wartość domyślna), prawdopodobnie warto sprawdzić, kto faktycznie psuje to zachowanie. Prosta metoda poniżej pętli na podviews widoku i rejestruje wartość scrollsToTop wszystkich UIScrollView w widoku. Najlepiej, aby być wywołanym w twoim poglądudidappear metoda.

- (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];
        }
    }
}

To jest tylko kod debugowania. Po znalezieniu wartości scrollsToTop dla każdej z podklas UIScrollView upewnij się, że tylko jedna jest ustawiona na YES.

 2
Author: DennyLou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-21 04:07:56

W pliku nagłówkowym UIScrollView:

// gdy użytkownik dotknie paska stanu, widok przewijania pod dotykiem, który znajduje się najbliżej paska stanu, zostanie przewinięty do góry, ale tylko jeśli jego właściwość scrollsToTop to YES, jego delegat nie zwraca nie z shouldScrollViewScrollToTop i nie znajduje się już na górze. // Na iPhonie wykonujemy ten gest tylko wtedy, gdy jest jeden widok przewijania na ekranie z scrollsToTop = = YES. Jeśli zostanie znalezionych więcej niż jeden, żaden nie będzie przewijany.

 1
Author: foskon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-26 11:47:18

Na przykład, jeśli masz widok tabeli i widok przewijania jak znaczniki takie jak ten

Tutaj wpisz opis obrazka

Powinieneś zrobić coś takiego w viewDidLoad

self.tableView.scrollsToTop = true
self.tagsView.scrollsToTop = false
 0
Author: Abo3atef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-03 14:18:14

Może być Wiele Potomków UIScrollView załadowanych np.: posiadanie kontrolera UIPageViewcontroller na każdej stronie zawierającej UITableViews.

Właściwość scrollsToTop jest domyślnie true .

Więc oprócz obsługi zagnieżdżonej właściwości scrollsToTop UIScrollViews, powinieneś wykonać następujące czynności:

//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
}

W ten sposób tylko jeden górny poziom scrollsToTop UITableView zostanie ustawiony na true.

 0
Author: Géza Mikló,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 14:35:46