wake-up-neo.net

Passen Sie den UITableView-Header-Abschnitt an

Ich möchte den UITableView-Header für jeden Abschnitt anpassen. Bisher habe ich umgesetzt 

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

diese UITabelViewDelegate Methode. Ich möchte den aktuellen Header für jeden Abschnitt abrufen und einfach UILabel als Unteransicht hinzufügen. 

Das kann ich bisher nicht. Weil ich nichts finden konnte, um den Standard-Kopfbereich zu erhalten. Erste Frage, gibt es eine Möglichkeit, den Standard-Header für Abschnitte zu erhalten ?

Wenn dies nicht möglich ist, muss ich eine Containeransicht erstellen, die eine UIView ist. Diesmal muss ich jedoch die Standardhintergrundfarbe, die Schattenfarbe usw. festlegen. Wenn Sie die Kopfzeile des Abschnitts sorgfältig betrachten, wird sie bereits angepasst. 

Wie kann ich diese Standardwerte für jeden Abschnittsheader erhalten? 

Danke euch allen.

131
limon

Sie können dies versuchen:

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 18)];
    /* Create custom view to display section header... */
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, tableView.frame.size.width, 18)];
    [label setFont:[UIFont boldSystemFontOfSize:12]];
     NSString *string =[list objectAtIndex:section];
    /* Section header is in 0th index... */
    [label setText:string];
    [view addSubview:label];
    [view setBackgroundColor:[UIColor colorWithRed:166/255.0 green:177/255.0 blue:186/255.0 alpha:1.0]]; //your background color...
    return view;
}
271

Die mit tableView :viewForHeaderInSection: ausgewählte Antwort ist korrekt.

Nur um hier einen Tipp zu teilen. 

Wenn Sie Storyboard/Xib verwenden, können Sie eine weitere Prototypzelle erstellen und für Ihre "Abschnittszelle" verwenden. Der Code zum Konfigurieren des Headers ähnelt der Konfiguration für Zeilenzellen.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    static NSString *HeaderCellIdentifier = @"Header";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:HeaderCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:HeaderCellIdentifier];
    }

    // Configure the cell title etc
    [self configureHeaderCell:cell inSection:section];

    return cell;
}
42
samwize

Schnelle Version von Lochana Tejas Antwort:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView(frame: CGRectMake(0, 0, tableView.frame.size.width, 18))
    let label = UILabel(frame: CGRectMake(10, 5, tableView.frame.size.width, 18))
    label.font = UIFont.systemFontOfSize(14)
    label.text = list.objectAtIndex(indexPath.row) as! String
    view.addSubview(label)
    view.backgroundColor = UIColor.grayColor() // Set your background color

    return view
}
29
estemendoza

Wenn Sie die Standard-Header-Ansicht verwenden, können Sie den Text nur mit ändern

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

Für Swift:

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

Wenn Sie die Ansicht anpassen möchten, müssen Sie sich selbst eine neue erstellen.

17
Mert

warum nicht UITableViewHeaderFooterView verwenden?

11
user836773

Wenn headerInSection nicht angezeigt wird, können Sie dies versuchen.

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

Dies gibt eine Höhe für den Header eines bestimmten Abschnitts zurück.

8
Kathen

Versuche dies......

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
{
    // Background view is at index 0, content view at index 1
    if let bgView = view.subviews[0] as? UIView
    {
        // do your stuff
    }

    view.layer.borderColor = UIColor.magentaColor().CGColor
    view.layer.borderWidth = 1
}
5
Gigi

Swift 3-Version von Lochana und Estemendoza Antworten:

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

    let view = UIView(frame: CGRect(x:0, y:0, width:tableView.frame.size.width, height:18))
    let label = UILabel(frame: CGRect(x:10, y:5, width:tableView.frame.size.width, height:18))
    label.font = UIFont.systemFont(ofSize: 14)
    label.text = "This is a test";
    view.addSubview(label);
    view.backgroundColor = UIColor.gray;
    return view

}

Beachten Sie auch, dass Sie AUCH implementieren müssen:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 100;
}
5
Adam
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    //put your values, this is part of my code
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 30.0f)];
    [view setBackgroundColor:[UIColor redColor]];
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 5, 150, 20)];
    [lbl setFont:[UIFont systemFontOfSize:18]];
    [lbl setTextColor:[UIColor blueColor]];
    [view addSubview:lbl];

    [lbl setText:[NSString stringWithFormat:@"Section: %ld",(long)section]];

    return view;
}
4
Boris Nikolić

Die anderen Antworten eignen sich gut zum Wiederherstellen der Standard-Header-Ansicht, beantworten jedoch nicht die Hauptfrage:

gibt es eine Möglichkeit, einen Standard-Header zu erhalten?

Es gibt einen Weg - implementieren Sie einfach tableView:willDisplayHeaderView:forSection: in Ihrem Delegierten. Die Standardheaderansicht wird an den zweiten Parameter übergeben. Von dort können Sie sie in eine UITableViewHeaderFooterView umwandeln und dann nach Bedarf Unteransichten hinzufügen/ändern.

Obj-C

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

    // Do whatever with the header view... e.g.
    // headerView.textLabel.textColor = [UIColor whiteColor]
}

Swift

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

    // Do whatever with the header view... e.g.
    // headerView.textLabel?.textColor = UIColor.white
}
4
Craig Brown

Dies ist die einfachste mögliche Lösung. Der folgende Code kann direkt zum Erstellen eines benutzerdefinierten Abschnittskopfs verwendet werden. 

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    SectionHeaderTableViewCell *headerView = [tableView dequeueReusableCellWithIdentifier:@"sectionHeader"];

    //For creating a drop menu of rows from the section
    //==THIS IS JUST AN EXAMPLE. YOU CAN REMOVE THIS IF-ELSE.==
    if (![self.sectionCollapsedArray[section] boolValue])
    {
        headerView.imageView.image = [UIImage imageNamed:@"up_icon"];
    }
    else
    {
        headerView.imageView.image = [UIImage imageNamed:@"drop_icon"];
    }

    //For button action inside the custom cell
    headerView.dropButton.tag = section;
    [headerView.dropButton addTarget:self action:@selector(sectionTapped:) forControlEvents:UIControlEventTouchUpInside];

    //For removing long touch gestures.
    for (UIGestureRecognizer *recognizer in headerView.contentView.gestureRecognizers)
    {
        [headerView.contentView removeGestureRecognizer:recognizer];
        [headerView removeGestureRecognizer:recognizer];
    }

    return headerView.contentView;
}

HINWEIS: SectionHeaderTableViewCell ist eine in Storyboard erstellte benutzerdefinierte UITableViewCell.

3
Anish Kumar

Wenn ich Sie wäre, würde ich eine Methode erstellen, die ein UIView zurückgibt, das ein NSString enthält. Zum Beispiel

+ (UIView *) sectionViewWithTitle:(NSString *)title;

Erstellen Sie bei der Implementierung dieser Methode eine UIView, fügen Sie ihr ein UILabel mit den Eigenschaften hinzu, die Sie festlegen möchten, und setzen Sie ihren Titel natürlich auf den angegebenen.

2
cpprulez
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    if([view isKindOfClass:[UITableViewHeaderFooterView class]]){

        UITableViewHeaderFooterView *headerView = view;

        [[headerView textLabel] setTextColor:[UIColor colorWithHexString:@"666666"]];
        [[headerView textLabel] setFont:[UIFont fontWithName:@"fontname" size:10]];
    }
}

Wenn Sie die Schriftart des textLabels in Ihrem Abschnittsheader ändern möchten, möchten Sie dies in willDisplayHeaderView tun. Um den Text festzulegen, können Sie dies in viewForHeaderInSection oder titleForHeaderInSection tun. Viel Glück!

2
John Ottenlips

Tabellenansichtskopf in Swift magisch hinzufügen

Vor kurzem habe ich das versucht.

Ich brauchte nur einen Header in der gesamten UITableView. 

Als ob ich eine UIImageView auf der TableView haben wollte. Also habe ich ein UIImageView über die UITableViewCell hinzugefügt und es wurde automatisch als tableViewHeader hinzugefügt. Jetzt verbinde ich das ImageView mit dem ViewController und füge das Image hinzu.

Ich war verwirrt, weil ich zum ersten Mal so etwas tat. Um meine Verwirrung zu beseitigen, öffnen Sie das XML-Format des MainStoryBoards und stellen fest, dass die Bildansicht als Header hinzugefügt wurde.

Es hat für mich funktioniert. Danke xCode und Swift.

1
Somir Saikia

swif 4.2

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }

    header.textLabel?.textAlignment = .center // for all sections

    switch section {
    case 1:  //only section No.1
        header.textLabel?.textColor = .black
    case 3:  //only section No.3
        header.textLabel?.textColor = .red
    default: //
        header.textLabel?.textColor = .yellow
    }
}
1
flowGlen

@Samwize's Lösung in Swift (also erheben Sie ihn!). Brilliant mit dem gleichen Recycling-Mechanismus auch für Kopf-/Fußzeilen:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let settingsHeaderSectionCell:SettingsHeaderSectionCell = self.dequeueReusableCell(withIdentifier: "SettingsHeaderSectionCell") as! SettingsHeaderSectionCell

    return settingsHeaderSectionCell
}

Zurück zur ursprünglichen Frage (4 Jahre später), anstatt Ihren eigenen Abschnittsheader neu zu erstellen, kann iOS Sie einfach anrufen (mit willDisplayHeaderView: forSection), direkt nachdem er den Standard erstellt hat. Ich wollte zum Beispiel eine Diagrammschaltfläche am rechten Rand des Abschnittskopfs hinzufügen:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    UITableViewHeaderFooterView * header = (UITableViewHeaderFooterView *) view;
    if (header.contentView.subviews.count >  0) return; //in case of reuse
    CGFloat rightEdge = CGRectGetMaxX(header.contentView.bounds);
    UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(rightEdge - 44, 0, 44, CGRectGetMaxY(header.contentView.bounds))];
    [button setBackgroundImage:[UIImage imageNamed:@"graphIcon"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(graphButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:button];
}
0
mackworth

Verwenden Sie tableView: willDisplayHeaderView:, um die Ansicht anzupassen, wenn sie angezeigt wird. 

Dadurch haben Sie den Vorteil, dass Sie die bereits erstellte Ansicht für die Kopfansicht übernehmen und erweitern können, anstatt die gesamte Kopfansicht selbst neu erstellen zu müssen.

Hier ist ein Beispiel, das den Kopfabschnitt auf der Grundlage einer BOOL-Datei einfärbt und der Kopfzeile ein Detailtextelement hinzufügt.

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
//    view.tintColor = [UIColor colorWithWhite:0.825 alpha:1.0]; // gray
//    view.tintColor = [UIColor colorWithRed:0.825 green:0.725 blue:0.725 alpha:1.0]; // reddish
//    view.tintColor = [UIColor colorWithRed:0.925 green:0.725 blue:0.725 alpha:1.0]; // pink

    // Conditionally tint the header view
    BOOL isMyThingOnOrOff = [self isMyThingOnOrOff];

    if (isMyThingOnOrOff) {
        view.tintColor = [UIColor colorWithRed:0.725 green:0.925 blue:0.725 alpha:1.0];
    } else {
        view.tintColor = [UIColor colorWithRed:0.925 green:0.725 blue:0.725 alpha:1.0];
    }

    /* Add a detail text label (which has its own view to the section header… */
    CGFloat xOrigin = 100; // arbitrary
    CGFloat hInset = 20;
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(xOrigin + hInset, 5, tableView.frame.size.width - xOrigin - (hInset * 2), 22)];

    label.textAlignment = NSTextAlignmentRight;

    [label setFont:[UIFont fontWithName:@"Helvetica-Bold" size:14.0]
    label.text = @"Hi.  I'm the detail text";

    [view addSubview:label];
}
0
Alex Zavatone

rufen Sie diese Delegatmethode auf 

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

return @"Some Title";
}

dadurch haben Sie die Möglichkeit, automatisch einen Standardheader mit dynamischem Titel hinzuzufügen.

Sie können wiederverwendbare und anpassbare Kopf-/Fußzeilen verwenden. 

https://github.com/sourov2008/UITableViewCustomHeaderFooterSection

0
Shourob Datta

Wenn Sie dem tableView-Header nur Titel hinzufügen möchten, fügen Sie keine Ansicht hinzu. In Swift 3.x lautet der Code folgendermaßen:

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    var lblStr = ""
    if section == 0 {
        lblStr = "Some String 1"
    }
    else if section == 1{
        lblStr = "Some String 2"
    }
    else{
        lblStr = "Some String 3"
    }
    return lblStr
}

Sie können ein Array implementieren, um den Titel für die Header abzurufen.

abgesehen von titleForHeaderInSection können Sie einfach die Ansicht von Kopf- und Fußzeile ändern. Überprüfen Sie meinen Kommentar hier: Ändern Sie den UITable-Abschnitt backgroundColor, ohne den Abschnitt Title zu verlieren

0
dimpiax