Mam, UITableView
który jest wypełniony komórkami o zmiennej wysokości. Chciałbym, aby tabela przewijała się na sam dół, gdy widok jest widoczny.
Obecnie mam następującą funkcję
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[log count]-1 inSection:0];
[self.table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
log to zmienna tablica zawierająca obiekty, które składają się na zawartość każdej komórki.
Powyższy kod działa dobrze, viewDidAppear
ale ma niefortunny efekt uboczny polegający na wyświetlaniu górnej części tabeli, gdy widok pojawia się po raz pierwszy, a następnie przeskakiwaniu na dół. Wolałbym, żeby table view
można było przewinąć do dołu, zanim się pojawi.
Próbowałem zwój viewWillAppear
i viewDidLoad
ale w obu przypadkach dane nie zostały załadowane do tabeli jeszcze i zarówno wyjątek.
Wszelkie wskazówki byłyby bardzo mile widziane, nawet jeśli chodzi tylko o powiedzenie mi, co mam, to wszystko, co jest możliwe.
źródło
[table reloadData];
CGPoint(x: 0, y: tableView.contentSize.height)
?Myślę, że najłatwiej jest to:
Wersja Swift 3:
źródło
messages.count
już zaimplementowanegomyTableView.dataSource!.tableView(myTableView, numberOfRowsInSection: 0)
. Tak, jest dłuższy, ale może uniknąć powtarzania kodu. Musisz również obsłużyć opcjonalnedataSource
(nie wymuszaj rozpakowywania, jak w tym przykładzie).Z odpowiedzi Jacoba , oto kod:
źródło
UIEdgeInsetsInsetRect(self.messagesTableView.frame, self.messagesTableView.safeAreaInsets).height
Jeśli chcesz przewinąć do DOKŁADNEGO końca treści, możesz to zrobić w następujący sposób:
źródło
yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
:? Dzięki.self.tableView.contentSize.height
zawartości tabeli, widok może nie być widoczny, ponieważ przewijasz poniżej treści. Dlatego musisz przewinąć do jednej „widocznej luki w widoku tabeli” nad końcem widoku tabeli.Używam autoukładu i żadna z odpowiedzi nie zadziałała. Oto moje rozwiązanie, które w końcu zadziałało:
źródło
setContentOffset
w innym momencie, gdy dane zostały pobrane i ponownie załadowane widok tabeli?CGFLOAT_MAX
użyłemcontentSize.height - frame.height + contentInset.bottom
podczas ustawiania początkowego przesunięcia zawartości. UżywanieCGFLOAT_MAX
wydawało mi się kłopotliwe.Przyjętego rozwiązania przez @JacobRelkin nie działa na mnie w iOS 7.0 przy użyciu automatycznego układu.
Mam niestandardową podklasę
UIViewController
i dodałem zmienną wystąpienia_tableView
jako podwidok jejview
. Pozycjonowałem_tableView
używając Auto Layout. Próbowałem nazwać tę metodę na końcu,viewDidLoad
a nawet wviewWillAppear:
. Żadne nie działało.Dlatego dodałem następującą metodę do mojej niestandardowej podklasy
UIViewController
.Dzwonię
[self tableViewScrollToBottomAnimated:NO]
pod koniecviewDidLoad
prac. Niestety powoduje to równieżtableView:heightForRowAtIndexPath:
trzykrotne wezwanie do każdej komórki.źródło
Oto rozszerzenie, które zaimplementowałem w Swift 2.0. Te funkcje należy wywołać po
tableview
załadowaniu:źródło
Detale
Kod
Stosowanie
Pełna próbka
źródło
Właściwie „Szybszy” sposób na zrobienie tego w szybkim to:
praca Idealna dla mnie.
źródło
Chciałem, aby stół ładował się końcem tabeli pokazanym w ramce. Znalazłem za pomocą
nie zadziałał, ponieważ dawał błąd, gdy wysokość tabeli była mniejsza niż wysokość ramy. Zauważ, że mój stół ma tylko jedną sekcję.
Rozwiązaniem, które zadziałało, było zaimplementowanie następującego kodu w viewWillAppear:
BOOL ivar initialLoad jest ustawiony na TRUE w viewDidLoad.
źródło
scrollToRowAtIndexPath
w ogóle musisz dzwonić ? Dzwonisz jużsetContentOffset
później, co może sprawić, że ta pierwsza rozmowa będzie bezcelowa.Dla Swift:
źródło
Zamiast tego powinieneś użyć
UITableViewScrollPositionBottom
.źródło
W przypadku Swift 3 (Xcode 8.1):
źródło
To oczywiście błąd. Prawdopodobnie gdzieś w kodzie, którego używasz
table.estimatedRowHeight = value
(na przykład 100). Zastąp tę wartość najwyższą wartością, jaką Twoim zdaniem może uzyskać wysokość wiersza , na przykład 500 .. To powinno rozwiązać problem w połączeniu z następującym kodem:źródło
Po wielu zabawach to zadziałało:
Kluczem okazała się być nie owijając
scrollToRowAtIndexPath
wnętrzedispatch_async
jak niektórzy sugerowali, ale po prostu po to wezwanie dolayoutIfNeeded
.Rozumiem to w ten sposób, że wywołanie metody scroll w bieżącym wątku gwarantuje, że przesunięcie przewijania zostanie ustawione bezpośrednio, przed wyświetleniem widoku. Kiedy wysyłałem wiadomość do głównego wątku, widok był wyświetlany na chwilę, zanim zwój zaczął działać.
(Pamiętaj też, że potrzebujesz
viewHasAppeared
flagi, ponieważ nie chcesz zagoToBottom
każdym razemviewDidLayoutSubviews
wywoływać. Jest wywoływana na przykład za każdym razem, gdy zmienia się orientacja).źródło
Korzystając z powyższych rozwiązań, spowoduje to przewinięcie do dołu tabeli (tylko jeśli zawartość tabeli jest ładowana jako pierwsza):
źródło
W Swift 3.0
źródło
Jeśli musisz załadować dane asynchronicznie przed przewinięciem w dół, oto możliwe rozwiązanie:
źródło
Funkcja w Swift 3 przewiń do dołu
źródło
należy dodać
lub nie przewinie się do dołu.
źródło
Użyj tego prostego kodu, aby przewinąć tableView bottom
źródło
Dzięki Jacob za odpowiedź. bardzo pomocne, jeśli ktoś jest zainteresowany wersją monotouch c #
źródło
W iOS działało to dobrze dla mnie
Musi zostać wywołany z
viewDidLayoutSubviews
źródło
[self.tableViewInfo scrollRectToVisible: CGRectMake (0, self.tableViewInfo.contentSize.height-self.tableViewInfo.height, self.tableViewInfo.width, self.tableViewInfo.height) animated: YES];
źródło
Zaakceptowana odpowiedź nie działa z moją tabelą (tysiące wierszy, dynamiczne ładowanie), ale poniższy kod działa:
źródło
Nie ma potrzeby przewijania, możesz to zrobić za pomocą tego kodu:
źródło
Jeśli konfigurujesz ramkę dla widoku tabeli programowo, upewnij się, że ustawiasz ramkę poprawnie.
źródło
W Swift po prostu potrzebujesz
aby automatycznie przewijał się do przycisku
źródło
W swift 3.0 Jeśli chcesz przejść do dowolnej konkretnej komórki widoku tabeli Zmień indeks komórki Wartość, na przykład zmień wartość „self.yourArr.count”.
źródło
Uważam, że stare rozwiązania nie działają ze swift3.
Jeśli znasz liczbę wierszy w tabeli, możesz użyć:
źródło