Jak wyłączyć przewijanie w tabeli UITableView, gdy zawartość mieści się na ekranie

240

Mam kilka (pogrupowanych stylów) tabel w mojej aplikacji na iPhone'a (tylko na części ekranu i dodałem, Interface Builderale nie podklasę od UITableViewController), że 80% czasu jest małe i zmieści się na ekranie. Gdy stół zmieści się na ekranie, chciałbym wyłączyć przewijanie, aby było trochę czystsze. Ale jeśli tabela zejdzie z ekranu (gdy zostaną do niej później dodane wiersze), chciałbym ponownie włączyć przewijanie (ponieważ w przeciwnym razie nie zobaczysz tej zawartości).

Czy jest na to sposób? Nie mogę tego rozgryźć. Wiem, że muszę:

tableView.scrollEnabled = NO;

ale nie jestem pewien, gdzie, ani czy muszę obliczyć rozmiar obiektu tabeli lub coś, aby to zadziałało.


Aktualizacja : Oto rozwiązanie, które w końcu dla mnie zadziałało:

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

Uruchamiam ten kod po wywołaniu reloadDatana stole, a on oblicza odpowiednie rozmiary i wydaje się działać.

table.frame.size.heightto rzeczywisty rozmiar obiektu (można to zobaczyć Interface Builder) wyświetlany na ekranie, natomiast table.contentSize.heightwysokości: nagłówek, stopka i wysokość każdej komórki zsumowane.

Ginny
źródło
1
Dzięki. To rozwiązanie działało dla mnie. Skończyło się jednak rozszerzaniem UITableView i nadpisywaniem reloadData, aby wyłączyć scrollEnabled. Powodem jest to, że widok tabeli jest ładowany podczas tworzenia kontrolera widoku. W ten sposób nie musisz wywoływać reloadData dwa razy.
Brandon O'Rourke,
@JoeBlow Myślę, że przegapiłeś punkt OP. Pytanie nie dotyczy tego, jak wyłączyć odbijanie, ale jak włączyć przewijanie (i odbijanie, najprawdopodobniej), gdy widok tabeli musi się przewijać.
Kyle Clegg,
Może lepiej jest użyć granic, ponieważ myślę, że jeśli trochę obrócisz swój stół, frame.height się zmieni.
Ricardo
Powinny być: if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

Odpowiedzi:

396

Myślę, że chcesz ustawić

tableView.alwaysBounceVertical = NO;
Lily Ballard
źródło
6
Działa to lepiej niż contentSize <ramka, gdy używasz AutoLayout. Należy przyjąć odpowiedź.
Joshua Dance
1
Korzystam z automatycznego układu i ta odpowiedź jest dokładnie tym, czego potrzebuję.
Złoty Kciuk
3
lepsze niż wyłączenie przewijania
Kirit Vaghela
5
działa jak urok, możesz go również wyłączyć, interface builderodznaczając odbijanie i odbijanie w poziomie / w pionie.
Ahsan Ebrahim
11
dla Swift - tableView.alwaysBounceVertical = false
swiftBoy
44

Za pomocą tej funkcji możesz zweryfikować liczbę widocznych komórek:

- (NSArray *)visibleCells

Ta metoda zwróci tablicę z widocznymi komórkami, dzięki czemu możesz policzyć liczbę obiektów w tej tablicy i porównać z liczbą obiektów w tabeli .. jeśli jest równa .. możesz wyłączyć przewijanie za pomocą:

tableView.scrollEnabled = NO;

Jak wspomniała @Ginny ... moglibyśmy mieć problemy z częściowo widocznymi komórkami, więc to rozwiązanie działa lepiej w tym przypadku:

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

W przypadku korzystania z autoLayout to rozwiązanie wykonuje zadanie:

tableView.alwaysBounceVertical = NO.
Roberto Ferraz
źródło
Dziękuję Ci! To teraz działa głównie dla mnie. Jedynym problemem, jaki mam teraz, jest to, że komórki są częściowo widoczne, nadal liczą się jako widoczne, dlatego przewijanie zostaje wyłączone, gdy w takim przypadku chcę je włączyć.
Ginny
6
Domyśliłam się! Okazuje się, że nie można tak naprawdę używać widocznych komórek z powodu częściowo widocznego problemu z komórką, ale to działa: if (table.contentSize.height < table.frame.size.height)>> zobacz edycję w oryginalnym poście.
Ginny
42

W Swift:

tableView.alwaysBounceVertical = false
Natividad Lara Diaz
źródło
18
Zawsze popieram takie „przepisywanie” takich „n̶s̶w̶e̶r̶s”, ponieważ konwersja na nowoczesną składnię wymaga czasu.
Dmitry Isaev
14

Istnieje więc wiele odpowiedzi i wymaga całej zawartości jednocześnie, więc dodam tę odpowiedź:

Jeśli używasz AutoLayout, ustawienie tej opcji powinno działać tylko dla Ciebie:

  • W kodzie:

tableView.alwaysBounceVertical = false

  • lub w Konstruktorze interfejsów:

Znajdź tę opcję i opcję untickBounce Vertically”.

Oto odniesienie:

wprowadź opis zdjęcia tutaj

Jeśli nie korzystasz z AutoLayout:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }
Hemang
źródło
13

Spróbuj tego

[yourTableView setBounces:NO];
codercat
źródło
@kyle - dzięki za notatkę! - ale spójrz, to dzieje się automatycznie. Jeśli jest krótszy niż ekran (lub inny uchwyt), NIE przewija się (i oczywiście nie odbije się, bo nawet się nie przewinie). Jeśli jest dłuższy niż ekran, przewinie się (i rzeczywiście odbije). Nie??
Fattie
Może zbyt często korzystam z widoków kolekcji ... może to działa tak, jak opisuję dla widoków kolekcji, ale nie dla UITableView ??
Fattie,
9

Możesz ustawić włączanie / wyłączanie odrzuceń lub przewijanie widoku tabeli, zaznaczając / odznaczając je w obszarze Widok przewijania

Przewiń Wyświetl obszar edycji

Akila Wasala
źródło
3

Możesz edytować to w swoim scenorysie (jeśli go używasz). Pod widokiem tabeli znajduje się pole wyboru z napisem „Przewijanie włączone”. Odznacz to i gotowe.

ericmarkmartin
źródło
3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;

rjobidon
źródło
3
Myślę, że zostałem oświecony po przeczytaniu twojego rozwiązania. Wielkie dzięki
Arash
Użyłem tego w moim widokuDidAppear
Maria
1
Miałem na myśli viewDidLayoutSubviews not viewDidAppear
Maria
0

Domyślna wysokość to 44,0 f dla komórki widoku tabeli. Musisz mieć źródło danych pod ręką w tablicy? Następnie po prostu sprawdź, czy [array count]*44.0fwykracza poza ramy ramki, a jeśli tak tableview.scrollEnabled = NO, ustaw go na TAK. Zrób to tam, gdzie obliczasz źródło danych dla tego konkretnego widoku tabeli.

Kres
źródło
Moje komórki tabeli mają różne rozmiary (i mogą zmieniać rozmiar w dowolnym momencie; używam metody heightForRowAtIndexPath), więc prawdopodobnie nie chciałbym na stałe wpisać 44.0f. Uważam, że ta liczba jest taka sama jak tableView.rowHeight?
Ginny
Następnie wykonasz obliczenia wysokości całkowitej w tej metodzie. Proste prawda? Jeśli przekroczy to granicę ekranu, włącz przewijanie, w przeciwnym razie pozostaw tę opcję wyłączoną. Metoda zostanie wywołana dla wszystkich widocznych komórek. Jeśli nie masz wystarczającej ilości danych do przekroczenia ekranu, możesz obliczyć całkowitą wysokość bezpośrednio w tej metodzie. Dodawaj do zmiennej globalnej wysokość, którą zwraca przy każdym połączeniu, a masz swoją całkowitą wysokość.
Bourne
Odpowiedź Roberto jest łatwiejszym sposobem na osiągnięcie tego wszystkiego i pozostawienie obliczeń w widoku tabeli.
Bourne