So deaktivieren Sie das Scrollen in der UITableView-Tabelle, wenn der Inhalt auf den Bildschirm passt

240

Ich habe ein paar (gruppierte) Tabellen in meiner iPhone-App (nur auf einem Teil des Bildschirms und hinzugefügt, Interface Builderobwohl nicht untergeordnet UITableViewController), die 80% der Zeit klein sind und auf den Bildschirm passen. Wenn die Tabelle auf den Bildschirm passt, möchte ich das Scrollen deaktivieren, um sie etwas sauberer zu machen. Wenn die Tabelle jedoch vom Bildschirm verschwindet (wenn später Zeilen hinzugefügt werden), möchte ich das Scrollen wieder aktivieren (da Sie diesen Inhalt sonst nicht sehen können.)

Gibt es eine Möglichkeit, dies zu tun? Ich kann es nicht herausfinden. Ich weiß zu tun:

tableView.scrollEnabled = NO;

Ich bin mir jedoch nicht sicher, wo oder ob ich die Tabellenobjektgröße oder etwas anderes berechnen muss, damit dies funktioniert.


Update : Hier ist die Lösung, die endlich für mich funktioniert hat:

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

Ich führe diesen Code aus, nachdem ich reloadDatadie Tabelle aufgerufen habe, und er berechnet die richtigen Größen und scheint zu funktionieren.

table.frame.size.heightist die tatsächliche Größe des Objekts (Sie können dies in sehen Interface Builder), die auf dem Bildschirm angezeigt wird, während table.contentSize.heightdie Höhe von: Kopfzeile, Fußzeile und Höhe jeder Zelle zusammenaddiert wird.

Ginny
quelle
1
Vielen Dank. Diese Lösung hat bei mir funktioniert. Am Ende habe ich jedoch UITableView erweitert und reloadData überschrieben, um scrollEnabled zu deaktivieren. Der Grund ist, dass die Tabellenansicht geladen wird, wenn mein Ansichtscontroller erstellt wird. Auf diese Weise müssen Sie reloadData nicht zweimal aufrufen.
Brandon O'Rourke
@ JoeBlow Ich denke, Sie haben den Punkt von OP verpasst. Die Frage ist nicht, wie das Abprallen deaktiviert werden soll, sondern wie das Scrollen (und höchstwahrscheinlich das Abprallen) nur aktiviert werden kann, wenn die Tabellenansicht gescrollt werden muss.
Kyle Clegg
Vielleicht ist es besser, Grenzen zu verwenden, denn ich denke, wenn Sie Ihren Tisch ein wenig drehen, wird sich die Höhe ändern.
Ricardo
Es sollte sein: if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

Antworten:

395

Ich denke du willst setzen

tableView.alwaysBounceVertical = NO;
Lily Ballard
quelle
6
Dies funktioniert besser als contentSize <Frame, wenn Sie AutoLayout verwenden. Sollte als Antwort akzeptiert werden.
Joshua Dance
1
Ich verwende das automatische Layout und diese Antwort ist genau das, was ich brauche.
Goldener Daumen
3
besser als das Scrollen zu deaktivieren
Kirit Vaghela
5
funktioniert wie ein Zauber, Sie können ihn auch deaktivieren, interface builderindem Sie Bounce deaktivieren und horizontal / vertikal springen.
Ahsan Ebrahim
11
für Swift - tableView.alwaysBounceVertical = false
swiftBoy
44

Mit dieser Funktion können Sie die Anzahl der sichtbaren Zellen überprüfen:

- (NSArray *)visibleCells

Diese Methode gibt ein Array mit den sichtbaren Zellen zurück, sodass Sie die Anzahl der Objekte in diesem Array zählen und mit der Anzahl der Objekte in Ihrer Tabelle vergleichen können. Wenn dies gleich ist, können Sie das Scrollen deaktivieren, indem Sie:

tableView.scrollEnabled = NO;

Wie @Ginny erwähnt hat, könnten wir Probleme mit teilweise sichtbaren Zellen haben, daher funktioniert diese Lösung in diesem Fall besser:

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

Wenn Sie autoLayout verwenden, erledigen Sie diese Lösung wie folgt:

tableView.alwaysBounceVertical = NO.
Roberto Ferraz
quelle
Danke dir! Das funktioniert jetzt hauptsächlich für mich. Das einzige Problem, das ich jetzt habe, ist, dass Zellen, die teilweise sichtbar sind, immer noch als sichtbar gelten und daher das Scrollen deaktiviert wird, wenn ich in diesem Fall möchte, dass es aktiviert wird.
Ginny
6
Herausgefunden! Es stellt sich heraus, dass Sie sichtbare Zellen aufgrund des Problems mit teilweise sichtbaren Zellen überhaupt nicht wirklich verwenden können, aber dies funktioniert: if (table.contentSize.height < table.frame.size.height)>> siehe Bearbeiten im ursprünglichen Beitrag.
Ginny
42

In Swift:

tableView.alwaysBounceVertical = false
Natividad Lara Diaz
quelle
18
Ich stimme solchen "Umschreibungen" immer zu, weil das Konvertieren in moderne Syntax Zeit erfordert.
Dmitry Isaev
14

Es gibt also mehrere Antworten und erfordert alle Inhalte auf einmal. Daher füge ich diese Antwort hinzu:

Wenn Sie AutoLayout verwenden, sollte dies nur für Sie funktionieren:

  • In Code:

tableView.alwaysBounceVertical = false

  • oder Im Interface Builder:

Finden Sie einfach diese Option und die Option untick" Bounce Vertically".

Hier ist die Referenz:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie AutoLayout nicht verwenden:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }
Hemang
quelle
13

Versuche dies

[yourTableView setBounces:NO];
Codercat
quelle
@ Kyle - danke für den Hinweis! - aber schau, das passiert automatisch. Wenn es kürzer als der Bildschirm (oder ein anderer Halter) ist, scrollt es NICHT (und springt offensichtlich nicht, weil es nicht einmal scrollt). Wenn es länger als der Bildschirm ist, wird es scrollen (und tatsächlich springen). Nein??
Fattie
Vielleicht habe ich Sammlungsansichten zu oft verwendet ... vielleicht funktioniert es so, wie ich es für Sammlungsansichten beschreibe, aber nicht für UITableView?
Fattie
9

Sie können das Aktivieren / Deaktivieren von Bounce oder das Scrollen in der Tabellenansicht festlegen, indem Sie diese im Bereich "Bildlaufansicht" auswählen / deaktivieren

Bearbeitungsbereich der Bildlaufansicht

Akila Wasala
quelle
3

Sie können dies in Ihrem Storyboard bearbeiten (falls Sie eines verwenden). In der Tabellenansicht befindet sich ein Kontrollkästchen mit der Aufschrift "Scrollen aktiviert". Deaktivieren Sie es und Sie sind fertig.

Ericmarkmartin
quelle
3

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

rjobidon
quelle
3
Ich glaube, ich war aufgeklärt, nachdem ich Ihre Lösung gelesen hatte. Vielen Dank
Arash
Ich habe dies in meiner viewDidAppear
Maria
1
Ich meinte viewDidLayoutSubviews nicht viewDidAppear
Maria
0

Die Standardhöhe ist 44.0f für eine Tabellenansichtszelle, glaube ich. Sie müssen Ihre Datenquelle in einem Array zur Hand haben? Überprüfen Sie dann einfach, ob [array count]*44.0fdie Rahmengrenzen überschritten werden, und tableview.scrollEnabled = NOsetzen Sie sie gegebenenfalls auf JA. Tun Sie dies dort, wo Sie die Datenquelle für diese bestimmte Tabellenansicht herausfinden.

Bourne
quelle
Meine Tabellenzellen haben unterschiedliche Größen (und können die Größe jederzeit ändern; ich verwende die heightForRowAtIndexPath-Methode), sodass ich 44.0f wahrscheinlich nicht fest codieren möchte. Ich glaube, diese Nummer ist sowieso die gleiche wie tableView.rowHeight?
Ginny
Sie würden dann Ihre Gesamthöhenberechnung mit dieser Methode durchführen. Einfach richtig? Wenn dies die Bildschirmgrenze überschreitet, aktivieren Sie den Bildlauf, andernfalls lassen Sie ihn deaktiviert. Die Methode wird für alle sichtbaren Zellen aufgerufen. Wenn Sie nicht über genügend Daten verfügen, um den Bildschirm zu überschreiten, können Sie die Gesamthöhe direkt in dieser Methode berechnen. Fügen Sie einer globalen Variablen die Höhe hinzu, die bei jedem Aufruf zurückgegeben wird, und Sie haben Ihre Gesamthöhe.
Bourne
Robertos Antwort ist eine einfachere Möglichkeit, all dies zu erreichen und die Berechnung der Tabellenansicht zu überlassen.
Bourne