Ändern der Schriftgröße für UITableView-Abschnittsüberschriften

138

Kann mich bitte jemand anweisen, wie ich die Schriftgröße für den Text in einem UITableView-Abschnittskopf am einfachsten ändern kann?

Ich habe die Abschnittsüberschriften mit der folgenden Methode implementiert:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

Dann verstehe ich, wie man die Höhe der Abschnittsüberschriften mit dieser Methode erfolgreich ändert:

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

Ich habe die UITableView-Zellen mit dieser Methode gefüllt:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

Ich bin jedoch nicht sicher, wie ich die Schriftgröße - oder auch den Schriftstil - des Abschnittsüberschriftstextes tatsächlich erhöhen kann.

Kann mir bitte jemand helfen? Vielen Dank.

JRD8
quelle
1
Schnelle Version
Juan Boero

Antworten:

118

Leider müssen Sie dies möglicherweise überschreiben:

In Ziel-C:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

In Swift:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

Versuchen Sie so etwas:

In Ziel-C:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    UILabel *myLabel = [[UILabel alloc] init];
    myLabel.frame = CGRectMake(20, 8, 320, 20);
    myLabel.font = [UIFont boldSystemFontOfSize:18];
    myLabel.text = [self tableView:tableView titleForHeaderInSection:section];

    UIView *headerView = [[UIView alloc] init];
    [headerView addSubview:myLabel];

    return headerView;
}

In Swift:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let myLabel = UILabel()
    myLabel.frame = CGRect(x: 20, y: 8, width: 320, height: 20)
    myLabel.font = UIFont.boldSystemFont(ofSize: 18)
    myLabel.text = self.tableView(tableView, titleForHeaderInSection: section)

    let headerView = UIView()
    headerView.addSubview(myLabel)

    return headerView
}
mosca1337
quelle
1
Danke dir. Das hat perfekt funktioniert. Sehr geschätzt.
JRD8
5
Dies ist zwar eine korrekte Lösung, aber seien Sie vorsichtig mit dieser Methode. Für eine Kopfzeile, die länger als eine Zeile ist, müssen Sie die Höhe der Kopfzeile berechnen, die tableView:heightForHeaderInSection:umständlich sein kann.
Leo Natan
3
Versuchte dies und während es funktioniert, wenn Sie die Tabelle nach oben scrollen, bleibt die Kopfzeilenbeschriftung auf dem Bildschirm und überlagert die Zellen. :(
Plasma
2
@trss Ich denke, Sie werden feststellen, dass dies kein erwartetes Verhalten ist. Ich spreche nicht von dem Header-Bereich, der dort bleibt, sondern nur von dem Etikett und seiner Überlagerung der Zellen, wenn sie darunter vorbeigehen, wodurch es wie ein echtes Chaos aussieht. Ich habe einen besseren Weg gefunden, um dies zu erreichen, und werde ihn zurückschicken, sobald ich ihn wieder finde.
Plasma
1
@ mosca1337 Es ist nicht erforderlich, eine weitere Ansicht zu erstellen. Sie können die aktuelle 'UITableViewHeaderFooterView' anzeigen lassen und die Parameter anpassen.
Juan Boero
366

Eine andere Möglichkeit, dies zu tun, wäre, auf die UITableViewDelegateMethode zu reagieren willDisplayHeaderView. Die übergebene Ansicht ist tatsächlich eine Instanz von a UITableViewHeaderFooterView.

Im folgenden Beispiel wird die Schriftart geändert und der Titeltext wird vertikal und horizontal in der Zelle zentriert. Beachten Sie, dass Sie auch darauf reagieren sollten heightForHeaderInSection, wenn Änderungen an der Höhe Ihrer Kopfzeile im Layout der Tabellenansicht berücksichtigt werden. (Das heißt, wenn Sie die Kopfhöhe bei dieser willDisplayHeaderViewMethode ändern möchten .)

Sie können dann auf die titleForHeaderInSectionMethode reagieren, um diesen konfigurierten Header mit verschiedenen Abschnittsüberschriften wiederzuverwenden.

Ziel c

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;

    header.textLabel.textColor = [UIColor redColor];
    header.textLabel.font = [UIFont boldSystemFontOfSize:18];
    CGRect headerFrame = header.frame;
    header.textLabel.frame = headerFrame;
    header.textLabel.textAlignment = NSTextAlignmentCenter;
}

Swift 1.2

(Hinweis: Wenn Ihr View Controller ein Nachkomme von a ist UITableViewController, muss dies als deklariert werden override func.)

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
{
    let header:UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView

    header.textLabel.textColor = UIColor.redColor()
    header.textLabel.font = UIFont.boldSystemFontOfSize(18)
    header.textLabel.frame = header.frame
    header.textLabel.textAlignment = NSTextAlignment.Center
}

Swift 3.0

Dieser Code stellt auch sicher, dass die App nicht abstürzt, wenn Ihre Header-Ansicht etwas anderes als eine UITableViewHeaderFooterView ist:

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }
    header.textLabel?.textColor = UIColor.red
    header.textLabel?.font = UIFont.boldSystemFont(ofSize: 18)
    header.textLabel?.frame = header.frame
    header.textLabel?.textAlignment = .center
}
Mark Semsel
quelle
3
Diese Methode funktionierte viel besser für mich als die oben genannte
Plasma
6
Beste Antwort, die ich gesehen habe.
Phatmann
2
Dies wäre der "richtige" Weg, um die Informationen anzupassen, vorausgesetzt, es gibt keinen anderen Grund für eine Unterklasse (wie zum Beispiel das Hinzufügen von Ansichten). Darüber hinaus kann diese Methode verwendet werden, um den Kopfzeilentext für Dynamic Type zu aktualisieren. Verwenden Sie einfach: header.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];und / oder header.detailTextLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];zusammen mit den anderen erforderlichen Schritten (siehe hier: captechconsulting.com/blog/john-szumski/… )
leanne
3
Dadurch wird die Größe der Kopfzeilenansicht nicht geändert. Wenn Ihre Schriftart also größer oder erheblich anders ist, z. B. Zapfino (fragen Sie nicht warum), wird der Text ausgeschnitten. Wenn Sie die Größe selbst berechnen müssen, ist es ein Chaos und Sie sollten es nicht tun.
Leo Natan
@CocoaPriest In meiner Beta-Version stürzt nicht ab, tho. (GM Samen 2)
Patrick Bassut
96

Die Antwort von mosca1337 ist zwar eine korrekte Lösung, aber seien Sie vorsichtig mit dieser Methode. Für eine Kopfzeile mit Text, der länger als eine Zeile ist, müssen Sie die Höhe der Kopfzeile berechnen, die tableView:heightForHeaderInSection:umständlich sein kann.

Eine sehr bevorzugte Methode ist die Verwendung der Erscheinungs-API:

[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont boldSystemFontOfSize:28]];

Dadurch wird die Schriftart geändert, während die Tabelle verlassen wird, um die Höhen selbst zu verwalten.

Um optimale Ergebnisse zu erzielen, unterklassifizieren Sie die Tabellenansicht und fügen Sie sie der Containment-Kette (in appearanceWhenContainedIn:) hinzu, um sicherzustellen, dass die Schriftart nur für die spezifischen Tabellenansichten geändert wird.

Leo Natan
quelle
1
Wenn Sie eine Unterklasse erstellen, würden Sie trotzdem eine benutzerdefinierte Ansicht von - tableView:viewForHeaderInSection:rechts zurückgeben? In diesem Fall kann die Schriftart genau dort eingestellt werden. Dies ist, was die Lösung von @ mosca1337 sowieso tut.
trss
1
Haha, nun, ich bin nach gestern ein Woozey. Unterklassifizieren Sie die Tabellenansicht und fügen Sie sie der Containerliste hinzu. ;-)
Leo Natan
2
Diese Lösung verursacht viele Fehler bei der Berechnung der tatsächlichen Größe von Fußzeilen / Kopfzeilen. Ich kann einige Beispiele zeigen, wenn die Titel geschnitten werden, während eine benutzerdefinierte Schriftart eingerichtet wird.
Kas-Kad
5
Swift 3 :UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)
Eric Hodgins
3
Dadurch wird die Größe der Beschriftung nicht korrekt an die Schriftart unter iOS 11 angepasst. Wenn Sie nach dem Laden der Ansichten nach oben und unten scrollen, werden sie auf die Standardschrift zurückgesetzt.
Nickdnk
25

Für iOS 7 benutze ich dies,


-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;

    header.textLabel.font = [UIFont boldSystemFontOfSize:10.0f];
    header.textLabel.textColor = [UIColor orangeColor];
}

Hier ist die Swift 3.0- Version mit Header-Größenänderung

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let header = view as? UITableViewHeaderFooterView {
        header.textLabel!.font = UIFont.systemFont(ofSize: 24.0)
        header.textLabel!.textColor = UIColor.orange          
    }
}
Maria
quelle
6
Dadurch wird die Größe der Kopfzeilenansicht nicht an die neue Schriftart angepasst.
Leo Natan
@LeoNatan Wie können wir die Größe der Kopfzeilenansicht an die neue Schriftart anpassen - kann dies mit dieser Methode erfolgen?
SAHM
Ich wollte klarstellen, dass ich Ihre obige Antwort gesehen habe, aber ich möchte die Schriftart nur ändern, um die Größe zu begrenzen, wenn eine vom Benutzer ausgewählte Schriftart (Barrierefreiheit) eine bestimmte Größe überschreitet (also nicht immer). Ich glaube, ich muss die Schriftart in willDisplayHeaderView überprüfen und möglicherweise ändern. Gibt es also eine Möglichkeit, die Ansichtshöhe neu zu berechnen, wenn die Schriftart geändert wird?
SAHM
19

Swift 3:

Einfachste Möglichkeit, nur die Größe anzupassen :

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    let header = view as! UITableViewHeaderFooterView

    if let textlabel = header.textLabel {
        textlabel.font = textlabel.font.withSize(15)
    }
}
jeff-ziligy
quelle
Das ist der einfachste Weg, den ich suche.
Ryan
Funktioniert in Swift 4! Vergessen Sie nicht "override func .."
Matvey
8

Swift 2.0 :

  1. Ersetzen Sie die Standardabschnittsüberschrift durch ein vollständig anpassbares UILabel.

Implementieren Sie viewForHeaderInSection wie folgt:

  override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let sectionTitle: String = self.tableView(tableView, titleForHeaderInSection: section)!
    if sectionTitle == "" {
      return nil
    }

    let title: UILabel = UILabel()

    title.text = sectionTitle
    title.textColor = UIColor(red: 0.0, green: 0.54, blue: 0.0, alpha: 0.8)
    title.backgroundColor = UIColor.clearColor()
    title.font = UIFont.boldSystemFontOfSize(15)

    return title
  }
  1. Ändern Sie den Standardheader (behält den Standard bei).

Implementieren Sie willDisplayHeaderView wie folgt:

  override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if let view = view as? UITableViewHeaderFooterView {
      view.backgroundView?.backgroundColor = UIColor.blueColor()
      view.textLabel!.backgroundColor = UIColor.clearColor()
      view.textLabel!.textColor = UIColor.whiteColor()
      view.textLabel!.font = UIFont.boldSystemFontOfSize(15)
    }
  }

Denken Sie daran: Wenn Sie statische Zellen verwenden, wird der erste Abschnittskopf aufgrund des oberen Bereichs von UITableView höher aufgefüllt als andere Abschnittsüberschriften. um dies zu beheben:

Implementieren Sie heightForHeaderInSection wie folgt:

  override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 30.0 // Or whatever height you want!
  }
Elliott Davies
quelle
4

Swift 4 Version von Leo Natan Antwort ist

UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)

Wenn Sie eine benutzerdefinierte Schriftart festlegen möchten, können Sie diese verwenden

if let font = UIFont(name: "font-name", size: 12) {
    UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = font
}
Giorgio
quelle
Dadurch wird die Größe des Rahmens leider nicht geändert.
Nickdnk
3

Mit dieser Methode können Sie auch die Schriftgröße, den Schriftstil und den Header-Hintergrund festlegen . Hierfür gibt es zwei Methoden

Erste Methode

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section{
        UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
        header.backgroundView.backgroundColor = [UIColor darkGrayColor];
        header.textLabel.font=[UIFont fontWithName:@"Open Sans-Regular" size:12];
        [header.textLabel setTextColor:[UIColor whiteColor]];
    }

Zweite Methode

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 30)];
//    myLabel.frame = CGRectMake(20, 8, 320, 20);
    myLabel.font = [UIFont fontWithName:@"Open Sans-Regular" size:12];
    myLabel.text = [NSString stringWithFormat:@"   %@",[self tableView:FilterSearchTable titleForHeaderInSection:section]];

    myLabel.backgroundColor=[UIColor blueColor];
    myLabel.textColor=[UIColor whiteColor];
    UIView *headerView = [[UIView alloc] init];
    [headerView addSubview:myLabel];
    return headerView;
}
Anup Gupta
quelle
1

Swift 2:

Passen Sie, wie von OP angefordert, nur die Größe an und nicht als fettgedruckte Systemschrift oder was auch immer:

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        if let headerView = view as? UITableViewHeaderFooterView, textLabel = headerView.textLabel {

            let newSize = CGFloat(16)
            let fontName = textLabel.font.fontName
            textLabel.font = UIFont(name: fontName, size: newSize)
        }
    }
Juan Boero
quelle
0

Dies ist meine Lösung mit Swift 5.

Um die Header-Abschnittsansicht vollständig zu steuern, müssen Sie die tableView (: viewForHeaderInsection: :) -Methode in Ihrem Controller verwenden, wie im vorherigen Beitrag gezeigt. Es gibt jedoch noch einen weiteren Schritt: Um die Leistung zu verbessern, empfiehlt Apple, nicht jedes Mal eine neue Ansicht zu generieren, sondern die Header-Ansicht wie die wiederverwendbare Tabellenzelle wiederzuverwenden. Dies erfolgt mit der Methode tableView.dequeueReusableHeaderFooterView (withIdentifier :). Das Problem, das ich hatte, ist jedoch, dass die Schriftart nicht wie erwartet funktioniert, sobald Sie diese Wiederverwendungsfunktion verwenden. Andere Dinge wie Farbe, Ausrichtung alles in Ordnung, aber nur Schrift. Es gibt einige Diskussionen, aber ich habe dafür gesorgt, dass es wie folgt funktioniert.

Das Problem ist tableView.dequeueReusableHeaderFooterView (withIdentifier :) ist nicht wie tableView.dequeneReuseCell (:), das immer eine Zelle zurückgibt. Ersteres gibt eine Null zurück, wenn niemand verfügbar ist. Selbst wenn eine Header-Ansicht für die Wiederverwendung zurückgegeben wird, handelt es sich nicht um Ihren ursprünglichen Klassentyp, sondern um eine UITableHeaderFooterView. Sie müssen also das Urteil fällen und gemäß Ihrem eigenen Code handeln. Wenn es Null ist, erhalten Sie im Grunde eine brandneue Header-Ansicht. Wenn nicht Null, erzwinge das Wirken, damit du kontrollieren kannst.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let reuse_header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "yourHeaderID")
        if (reuse_header == nil) {
            let new_sec_header = YourTableHeaderViewClass(reuseIdentifier:"yourHeaderID")
            new_section_header.label.text="yourHeaderString"
            //do whatever to set color. alignment, etc to the label view property
            //note: the label property here should be your custom label view. Not the build-in labelView. This way you have total control.
            return new_section_header
        }
        else {
            let new_section_header = reuse_section_header as! yourTableHeaderViewClass
            new_sec_header.label.text="yourHeaderString"
            //do whatever color, alignment, etc to the label property
            return new_sec_header}

    }
JerryH
quelle