Ich verwende ein, UITableView
um Inhaltsseiten zu gestalten. Ich verwende die Überschriften der Tabellenansicht, um bestimmte Bilder usw. zu gestalten, und ich würde es vorziehen, wenn sie nicht schweben, sondern statisch bleiben, wie sie es tun, wenn der Stil eingestellt ist UITableViewStyleGrouped
.
Gibt UITableViewStyleGrouped
es eine andere Möglichkeit, als dies zu tun? Ich möchte die Verwendung von gruppiert vermeiden, da dadurch ein Rand für alle meine Zellen hinzugefügt wird und die Hintergrundansicht für jede der Zellen deaktiviert werden muss. Ich möchte die volle Kontrolle über mein Layout haben. Im Idealfall handelt es sich um "UITableViewStyleBareBones", aber ich habe diese Option in den Dokumenten nicht gesehen ...
Danke vielmals,
ios
objective-c
iphone
cocoa-touch
uikit
Tricky
quelle
quelle
Antworten:
Sie sollten in der Lage sein, dies zu fälschen, indem Sie eine benutzerdefinierte Zelle verwenden, um Ihre Kopfzeilen zu erstellen. Diese scrollen dann wie jede andere Zelle in der Tabellenansicht.
Sie müssen nur eine Logik hinzufügen
cellForRowAtIndexPath
, um den richtigen Zelltyp zurückzugeben, wenn es sich um eine Kopfzeile handelt.Sie müssen Ihre Abschnitte wahrscheinlich selbst verwalten, dh alles in einem Abschnitt haben und die Überschriften fälschen. (Sie können auch versuchen, eine ausgeblendete Ansicht für die Header-Ansicht zurückzugeben, aber ich weiß nicht, ob dies funktioniert.)
quelle
Ein wahrscheinlich einfacher Weg, dies zu erreichen:
Ziel c:
Schnell:
Abschnittsüberschriften werden jetzt wie in jeder normalen Zelle gescrollt.
quelle
(Für alle, die aufgrund eines falschen Tabellenstils hierher gekommen sind) Ändern Sie den Tabellenstil von einfach in gruppiert, über den Attributinspektor oder über den Code:
quelle
TableView Style
Eigenschaft auch im AttributesInspector finden.WARNUNG : Diese Lösung implementiert eine reservierte API-Methode. Dies könnte verhindern, dass die App von Apple für die Verteilung im AppStore genehmigt wird.
Ich habe die privaten Methoden beschrieben, mit denen Abschnittsüberschriften in meinem Blog schweben
Grundsätzlich müssen Sie nur zwei seiner Methoden unterordnen
UITableView
und zurückgebenNO
:quelle
Ok, ich weiß, dass es spät ist, aber ich musste es tun. Ich habe inzwischen 10 Stunden nach einer funktionierenden Lösung gesucht, aber keine vollständige Antwort gefunden. Habe einige Hinweise gefunden, aber für den Anfang schwer zu verstehen. Also musste ich meine 2 Cent eingeben und die Antwort vervollständigen.
Wie in den wenigen Antworten vorgeschlagen, war die einzige funktionierende Lösung, die ich implementieren konnte, das Einfügen normaler Zellen in die Tabellenansicht und deren Behandlung als Abschnittsüberschriften. Der bessere Weg, dies zu erreichen, ist das Einfügen dieser Zellen bei Zeile 0 jedes Abschnitts. Auf diese Weise können wir diese benutzerdefinierten nicht schwebenden Header sehr einfach verarbeiten.
Die Schritte sind also.
Implementieren Sie UITableView mit dem Stil UITableViewStylePlain.
Implementieren Sie titleForHeaderInSection wie gewohnt (Sie können diesen Wert mithilfe Ihrer eigenen Logik abrufen, ich bevorzuge jedoch die Verwendung von Standarddelegierten).
Implementieren Sie numberOfSectionsInTableView wie gewohnt
Implementieren Sie numberOfRowsInSection wie gewohnt.
Geben Sie 0.0f in heightForHeaderInSection zurück.
Implementieren Sie NICHT viewForHeaderInSection. Entfernen Sie die Methode vollständig, anstatt Null zurückzugeben.
In heightForRowAtIndexPath. Überprüfen Sie, ob (indexpath.row == 0) und geben Sie die gewünschte Zellenhöhe für den Abschnittskopf zurück, andernfalls geben Sie die Höhe der Zelle zurück.
Überprüfen Sie nun in cellForRowAtIndexPath, ob (indexpath.row == 0), und implementieren Sie die Zelle so, wie der Abschnittskopf sein soll, und setzen Sie den Auswahlstil auf none. Andernfalls implementieren Sie die Zelle so, wie Sie es von der normalen Zelle erwarten.
Implementieren Sie nun willSelectRowAtIndexPath und geben Sie nil zurück, wenn indexpath.row == 0. Dies wird dafür sorgen, dass didSelectRowAtIndexPath niemals für die Abschnittsheaderzeile ausgelöst wird.
Überprüfen Sie schließlich in didSelectRowAtIndexPath, ob (indexpath.row! = 0), und fahren Sie fort.
Damit sind Sie fertig. Sie haben jetzt eine perfekt scrollende, nicht schwebende Abschnittsüberschrift.
quelle
Klicken Sie in Ihrem Interface Builder auf Ihre Problemtabellenansicht
Navigieren Sie dann zu Attributes Inspector und ändern Sie Style Plain in Grouped;) Easy
quelle
Das Interessante an UITableViewStyleGrouped ist, dass die tableView den Zellen den Stil hinzufügt und nicht der TableView.
Der Stil wird den Zellen als Hintergrundansicht als Klasse mit dem Namen UIGroupTableViewCellBackground hinzugefügt, die das Zeichnen unterschiedlicher Hintergründe entsprechend der Position der Zelle im Abschnitt behandelt.
Eine sehr einfache Lösung besteht darin, UITableViewStyleGrouped zu verwenden, die Hintergrundfarbe der Tabelle auf clearColor zu setzen und einfach die Hintergrundansicht der Zelle in cellForRow zu ersetzen:
quelle
Ändern Sie Ihren TableView-Stil:
Gemäß Apple-Dokumentation für UITableView:
quelle
Es gibt noch einen anderen schwierigen Weg. Die Hauptidee besteht darin, die Abschnittsnummer zu verdoppeln, und die erste zeigt nur die Header-Ansicht, während die zweite die realen Zellen zeigt.
Was dann zu tun ist, ist die Implementierung der headerInSection-Delegaten:
Dieser Ansatz hat auch nur geringe Auswirkungen auf Ihre Datenquellen:
Im Vergleich zu anderen Ansätzen ist dieser Weg sicher, ohne den Frame oder die contentInsets der Tabellenansicht zu ändern. Hoffe das kann helfen.
quelle
Der einfachste Weg, um das zu bekommen, was Sie wollen, besteht darin, Ihren Tabellenstil wie folgt
UITableViewStyleGrouped
festzulegenUITableViewCellSeparatorStyleNone
:Versuchen Sie nicht, die Fußzeilenansicht zurückzugeben, da
nil
Sie die Kopfzeilenhöhe und die Kopfzeilenansicht nicht vergessen haben, nachdem Sie das gewünschte Ergebnis erhalten haben.quelle
Obwohl dies Ihr Problem möglicherweise nicht löst, war es für mich der Fall, als ich etwas Ähnliches tun wollte. Anstatt die Kopfzeile zu setzen, habe ich die Fußzeile des obigen Abschnitts verwendet. Was mich gerettet hat, war, dass dieser Abschnitt klein und statisch war und daher nie unter den unteren Rand der Ansicht gescrollt wurde.
quelle
Für Swift 3+
Verwenden Sie einfach
UITableViewStyleGrouped
die Fußzeile und setzen Sie sie wie folgt auf Null:quelle
.leastNormalMagnitude
. Auch müssen Sie implementierentableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
viewForFooterInSection
In diesem Fall ist es auch nicht erforderlich, die Funktion zu implementieren .0
und.leastNormalMagnitude
hatte den gleichen Effekt. Die Implementierung derviewForFooterSection
Methode ist erforderlich. Sie sollten null zurückgeben. Dies ist auf Swift 5.1 mit Xcode 11.3.1.Während ich darüber nachdachte, wie ich dieses Problem angehen sollte, erinnerte ich mich an ein sehr wichtiges Detail von UITableViewStyleGrouped. Die Art und Weise, wie UITableView den gruppierten Stil (die abgerundeten Ränder um die Zellen) implementiert, besteht darin, den UITableViewCells eine benutzerdefinierte Hintergrundansicht und nicht der UITableView hinzuzufügen. Jeder Zelle wird eine Hintergrundansicht entsprechend ihrer Position im Abschnitt hinzugefügt (obere Reihen erhalten den oberen Teil des Abschnittsrandes, mittlere den seitlichen Rand und der untere Teil - nun, den unteren Teil). Wenn wir also nur einen einfachen Stil möchten und keine benutzerdefinierte Hintergrundansicht für unsere Zellen haben (was in 90% der Fälle der Fall ist), müssen wir nur UITableViewStyleGrouped verwenden und den benutzerdefinierten Hintergrund entfernen . Dies kann durch Ausführen der beiden folgenden Schritte erfolgen:
Ändern Sie unseren tableView-Stil in UITableViewStyleGrouped. Fügen Sie cellForRow die folgende Zeile hinzu, bevor wir die Zelle zurückgeben:
cell.backgroundView = [[[UIView alloc] initWithFrame: cell.bounds] autorelease];
Und das ist es. Der tableView-Stil wird mit Ausnahme der schwebenden Header genau wie UITableViewStylePlain.
Hoffe das hilft!
quelle
Vielleicht könnten Sie
scrollViewDidScroll
auf der tableView verwenden und die änderncontentInset
basierend auf dem aktuell sichtbaren Header .Es scheint für meinen Anwendungsfall zu funktionieren!
quelle
Eine andere Möglichkeit besteht darin, einen leeren Abschnitt direkt vor dem zu erstellen, auf dem die Überschrift angezeigt werden soll, und die Überschrift auf diesen Abschnitt zu setzen. Da der Abschnitt leer ist, wird die Kopfzeile sofort gescrollt.
quelle
Sie können oben einen Abschnitt (mit null Zeilen) hinzufügen und dann den obigen AbschnittFooterView als HeaderView des aktuellen Abschnitts festlegen. FooterView schwebt nicht. Hoffe es gibt eine Hilfe.
quelle
XAK ignorieren. Erforschen Sie keine privaten Methoden, wenn Sie möchten, dass Ihre App von Apple akzeptiert wird.
Dies ist am einfachsten, wenn Sie Interface Builder verwenden. Sie würden eine UIView oben in der Ansicht hinzufügen (wohin die Bilder gehen) und dann Ihre Tabellenansicht darunter hinzufügen. IB sollte es entsprechend dimensionieren; Das heißt, der obere Rand der Tabellenansicht berührt den unteren Rand des gerade hinzugefügten UIView und seine Höhe deckt den Rest des Bildschirms ab.
Der Gedanke hier ist, dass wenn diese UIView nicht tatsächlich Teil der Tabellenansicht ist, sie nicht mit der Tabellenansicht scrollen wird. dh ignorieren Sie den Tableview-Header.
Wenn Sie den Interface Builder nicht verwenden, ist dies etwas komplizierter, da Sie die richtige Position und Höhe für die Tabellenansicht festlegen müssen.
quelle
Überprüfen Sie die Antwort zum Implementieren von Headern mit StoryBoard: Tabellenkopfansichten in StoryBoards
Beachten Sie auch, dass, wenn Sie nicht implementieren
es wird nicht schweben, was genau das ist, was Sie wollen.
quelle
Gehen Sie folgendermaßen vor, um die Header-Abschnitte für schwebende Abschnitte vollständig zu entfernen:
return nil
funktioniert nichtUm das Floating zu deaktivieren, aber dennoch Abschnittsüberschriften anzuzeigen, können Sie eine benutzerdefinierte Ansicht mit eigenen Verhaltensweisen bereitstellen.
quelle
Eine Variation der Lösung von @ samvermette:
quelle
Das Snippet zeigt nur für den ersten Abschnitt einen klebrigen Header an. Andere Abschnittsüberschriften schweben mit einer Zelle.
quelle
Dies kann erreicht werden, indem die Header-Ansicht manuell in der viewDidLoad-Methode des UITableViewController zugewiesen wird, anstatt die viewForHeaderInSection und heightForHeaderInSection des Delegaten zu verwenden. In Ihrer Unterklasse von UITableViewController können Sie beispielsweise Folgendes tun:
Die Kopfzeilenansicht verschwindet dann, wenn der Benutzer einen Bildlauf durchführt. Ich weiß nicht, warum das so funktioniert, aber es scheint zu erreichen, was Sie tun möchten.
quelle
Vielleicht können Sie den Hintergrund der Kopfzeile einfach transparent machen:
Oder wenden Sie es global an:
quelle
Ich habe eine andere, noch einfachere Lösung, die ohne Autolayout und mit allem, was über XIB erledigt wird, verwendet werden kann:
1 / Fügen Sie Ihre Kopfzeile in die Tabellenansicht ein, indem Sie sie direkt in die Tabellenansicht ziehen und dort ablegen.
2 / Ändern Sie im Größeninspektor des neu erstellten Headers einfach die automatische Größe: Sie sollten nur den oberen, linken und rechten Anker sowie die Füllung horizontal lassen.
Das sollte den Trick machen!
quelle
Laut der Antwort von @ samvermette , Ich habe den obigen Code in Swift implementiert, um Codierern die Verwendung von Swift zu erleichtern.
quelle
Ref: https://stackoverflow.com/a/26306212
let tableView = UITableView(frame: .zero, style: .grouped)
PLUSE
Dies half, den Header-Platz zu nutzen
quelle
2020 Neuestes Update
Getestet mit Xcode 14.
Um einen Abschnittskopf auszublenden, geben Sie nil als Titel des Abschnittsdelegierten zurück
quelle
Sie können dies leicht erreichen, indem Sie die viewForHeaderInSection-Methode in der tableview-Delegatenklasse implementieren. Diese Methode erwartet eine UIView als Rückgabeobjekt (dies ist Ihre Header-Ansicht). Ich habe das gleiche in meinem Code getan
quelle