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.


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.


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.


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


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.


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


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))
}

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.


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).


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 .


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.


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
        }
    }


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;
}

0

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

Größeninspektor-Header


-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>
}

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;

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


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 

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.