Wie lege ich die Höhe des Tabellenkopfes in UITableView fest?

76

Ich habe Apple-Dokumente zur UITableView-Klasse und zur Delegatenreferenz durchgesehen, konnte jedoch keine Möglichkeit finden, die Höhe des Tabellenkopfs explizit festzulegen.

Ich habe die Tabellenzellenhöhe mit folgendem Delegaten festgelegt:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

und stellen Sie die Höhe der Kopf- / Fußzeile des Abschnitts mit den folgenden Delegaten ein.

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section

Könnte mir bitte jemand helfen, die Höhe der Kopf- / Fußzeile der Tabelle festzulegen?

Vielen Dank.

Applefreak
quelle
1
es funktioniert nicht, wenn Sie 0 zurückgeben; aber wenn ich 0.1f zurückgebe, funktioniert es für mich
igrek

Antworten:

65

Legen Sie einfach die Frame-Eigenschaft von tableHeaderView fest.

Roger
quelle
Das mache ich schon Ich habe mein Bild auf tableheaderview gesetzt. Ich kann die Höhe des Tabellenkopfs nicht ändern. Die HeaderImaze-Größe ist 640x88 und wird auf 320x88 neu skaliert, was falsch ist. Ich möchte meine Tabellenkopfhöhe auf 44 setzen, wenn die angegebene Bildauflösungsbreite 640 beträgt.
applefreak
1
Hallo Roger, ich denke deine Idee sollte funktionieren. Ich habe versucht, die Frame-Eigenschaft mit "plainTableView.tableHeaderView.frame = CGRectMake (0,0,320,44)" festzulegen. aber nichts passiert. Bitte beachten Sie, dass meine Bildgröße 640x88 ist und ich sie tableHeaderView zuweise.
Applefreak
Das Folgende hat bei mir funktioniert. Ich konnte die Tabellenhöhe nicht ändern, aber ich habe die Bildhöhe zurückgesetzt. if (headerImage.bounds.size.width == 640) [headerImage setFrame: CGRectMake (0, 0, headerImage.bounds.size.width, headerImage.bounds.size.height / 2)];
Applefreak
62

Ich habe einen schönen Hack gefunden. Fügen Sie die folgende Zeile hinzu, nachdem Sie die Rahmeneigenschaft geändert haben

self.tableView.tableHeaderView = self.tableView.tableHeaderView;

Der Trick ist (glaube ich), dass die UITableView die Höhe (den Rahmen tatsächlich) zwischenspeichert, wenn Sie die Ansicht der tableHeaderView-Eigenschaft zuweisen. Die obige Zeile weist nur die Höhe erneut zu.

Cristian Bica
quelle
Wenn Sie jedoch versuchen, die Änderung zu animieren, scheint sie nur in der Schrumpfungsrichtung zu funktionieren.
Gujamin
1
Animation oder nicht, dies ist die schnellste Lösung. Perfekt :)
iPhoneNoob
Ich kann nicht glauben, dass dies die Lösung war! Es funktioniert, um den Header kleiner und größer zu machen. Für Swift mache ich - tableView.tableHeaderView! .Frame = CGRectMake (0, 0, self.view.frame.size.width, 100) tableView.tableHeaderView = self.tableView.tableHeaderView
Michael McKenna
39
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    sizeHeaderToFit()
}

private func sizeHeaderToFit() {
    let headerView = tableView.tableHeaderView!

    headerView.setNeedsLayout()
    headerView.layoutIfNeeded()

    let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
    var frame = headerView.frame
    frame.size.height = height
    headerView.frame = frame

    tableView.tableHeaderView = headerView
}

Weitere Details finden Sie hier

Kris
quelle
1
Genial. Vielen Dank Kris. Ihre Funktion funktioniert in viewDidAppear immer noch hervorragend. Es ist besser als viewDidLayoutSubviews, das oft aufgerufen wird.
Truongky
1
@truongky Nein, viewDidLayoutSubviews funktioniert zB beim Drehen oder beim Ändern der Fenstergröße (z. B. geteilter iPad-Bildschirm). Wenn die Größe danach geändert werden soll, wird viewWill / DidAppear es niemals aktualisieren und es wird falsch aussehen.
Vive
2
Dies führt zu einem Einfrieren aufgrund endloser
Layoutschleifen
10

Falls Sie es noch benötigen, haben Sie versucht, die Eigenschaft festzulegen

self.tableView.tableHeaderView 

Wenn Sie die benötigte Höhe berechnen und eine neue Ansicht festlegen für tableHeaderView:

CGRect frame = self.tableView.tableHeaderView.frame;
frame.size.height = newHeight;

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:frame];

Es sollte funktionieren.

Fabio
quelle
7

Es funktioniert nur bei mir, wenn ich zuerst die Fußzeile / Kopfzeile der Tabellenansicht auf Null setze:

self.footer = self.searchTableView.tableFooterView;
CGRect frame = self.footer.frame;
frame.size.height = 200;
self.footer.frame = frame;
self.searchTableView.tableFooterView = nil;
self.searchTableView.tableFooterView = self.footer;

Stellen Sie sicher, dass self.footer eine starke Referenz ist, um zu verhindern, dass die Zuordnung der Fußzeilenansicht aufgehoben wird

Hossam Ghareeb
quelle
self.searchTableView.tableFooterView = self.searchTableView.tableFooterView;funktioniert auch.
Superarts.org
4

Swift 4 - Sie können die Höhe mit HEIGHT_VIEW verwalten. Fügen Sie einfach diese Cods hinzu. Es funktioniert

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let HEIGHT_VIEW = 60
    tableView.tableFooterView?.frame.size = CGSize(width: tblView.frame.width, height: CGFloat(HEIGHT_VIEW))

    tableView.tableHeaderView?.frame.size = CGSize(width:tblView.frame.width, height: CGFloat(HEIGHT_VIEW))
}
Krunal Patel
quelle
Die beste Antwort
Michał Ziobro
2
Gute Lösung, aber das "tblView" ist ein Schlag ins Auge! : 'D
Alessandro Francucci
2

Erstellen Sie einfach die Footer-Wrapper-Ansicht mit dem Konstruktor. UIView(frame:_) Wenn Sie die xib-Datei für FooterView verwenden, erstellen Sie eine Ansicht aus xib und fügen Sie sie als SubView zur Wrapper-Ansicht hinzu. Weisen Sie dann den Wrapper zu tableView.tableFooterView = fixWrapper.

    let fixWrapper = UIView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 54)) // dont remove
    let footer = UIView.viewFromNib("YourViewXibFileName") as! YourViewClassName
    fixWrapper.addSubview(footer)
    tableView.tableFooterView = fixWrapper
    tableFootterCostView = footer

Es funktioniert perfekt für mich! Der Punkt ist, eine Fußzeilenansicht mit dem Konstruktor zu erstellen (frame:_). Obwohl Sie UIView () erstellen und Frame-Eigenschaften zuweisen, funktioniert dies möglicherweise nicht.

Sergey Sahakyan
quelle
2

Wenn Sie in IB eine Ansicht als Tabellenkopfansicht hinzufügen, legen Sie den Rahmen dieser Ansicht in IB in Tab 5 fest (Größeninspektor).

Yllow
quelle
1

Wenn Sie XIB für die HauptheaderView von tableView verwenden, können Sie XIB als Freiform festlegen. Stellen Sie die Höhe wie gewünscht ein und deaktivieren Sie die oberen, unteren Blöcke und oberen und unteren Pfeile von Autoresizing. Es werden nur horizontale Teile ausgewählt. Vertikal wird nicht ausgewählt, wie oben erwähnt .

Talip Böke
quelle
1

Sie können eine UIView mit der gewünschten Höhe erstellen (die Breite sollte der der UITableView entsprechen) und darin eine UIImageView mit dem Bild der richtigen Abmessungen platzieren: Sie werden nicht automatisch gedehnt.

Sie können auch einen Rand über und unter der inneren UIImageView angeben, indem Sie der Containeransicht eine höhere Höhe geben.

Darüber hinaus können Sie eine Übersetzungstransformation zuweisen, um das Bild beispielsweise in der Mitte der Container-Header-Ansicht zu platzieren.

Gabriel
quelle
1

Wenn Sie das programmgesteuert einstellen tableHeaderView, stellen Sie es einfach ein viewDidLayoutSubviews.

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        setupTableViewHeader()
    }

    private func setupTableViewHeader() {
        // Something you do to set it up programatically...
        tableView.tableHeaderView = MyHeaderView.instanceFromNib() 
    }

Wenn Sie es nicht programmgesteuert festgelegt haben, müssen Sie ähnliche Schritte ausführen, wie @Kris anhand dieses Links geantwortet hat

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        sizeHeaderToFit()
    }

    private func sizeHeaderToFit() {
        if let headerView = tableView.tableHeaderView {
            headerView.setNeedsLayout()
            headerView.layoutIfNeeded()

            let height = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
            var frame = headerView.frame
            frame.size.height = height
            headerView.frame = frame

            tableView.tableHeaderView = headerView
        }
    }

meow2x
quelle
1

@kris Antwort ist hilfreich für mich, jeder möchte es in Objective-C.

Hier ist der Code

-(void)viewDidLayoutSubviews{
     [super viewDidLayoutSubviews];
     [self sizeHeaderToFit];
}

-(void)sizeHeaderToFit{
     UIView *headerView = self.tableView.tableHeaderView;
     [headerView setNeedsLayout];
     [headerView layoutIfNeeded];
     CGFloat height = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
     CGRect frame = headerView.frame;
     frame.size.height = height;
     headerView.frame = frame;
     self.tableView.tableHeaderView = headerView;
}
Yogesh Patel
quelle
0

In Xcode 10 können Sie die Kopf- und Fußzeile der Abschnittshöhe auf der Registerkarte "Größeninspektor" festlegen

Größeninspektor-Header

NinjaDeveloper
quelle
-1

Mit Autolayout können Sie Folgendes tun:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = <your-header-height>

oder wenn Ihre Header unterschiedlich hoch sind, setzen Sie Folgendes um:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return <your-header-height>
}
Matti
quelle
Das OP fragte nach tableView Header, nicht Section Header;)
Climbatize
-1

Wenn Sie die Höhe von headerView von tableView geändert haben, setzen Sie einfach den Frame von headerView zurück und setzen Sie dann headerView von tableView zurück:

self.headerView.frame = newFrame;
self.tableView.tableHeaderView = self.headerView;
Meilbn
quelle
Dies macht so viel mehr als erforderlich. Verwenden Sie es nicht für eine so einfache Aufgabe. Ein einfaches setNeedsLayout reicht aus, wenn Sie es beschreiben.
Vive
-2

Standardeigenschaft der Tabellenansicht verwenden:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 35.0;
}

Vielen Dank

Mitesh Khatri
quelle
1
Nein, es funktioniert nicht. Ich versuchte es. Es ändert die Größe für die Kopf- / Fußzeile eines Abschnitts, nicht für die Kopf- / Fußzeile einer Tabelle. Vermisse ich etwas
Applefreak
42
Wir diskutieren nicht über SEction-Header. Es geht um tableView Header
iSaalis
-2
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
}

oder du kannst so auch verwenden

tableView.estimatedSectionHeaderHeight 
Mnsd
quelle
Wir diskutieren nicht über SEction-Header. Es geht um tableView Header
Arthur Garza
Ich verwende die Kopf- und Fußzeile des Abschnitts als Kopf- und Fußzeile für die Tabelle. Das gilt also für mich und war hilfreich. Ich fand es einfacher als die anderen Lösungen.
David J