Hinzufügen von iOS UITableView HeaderView (kein Abschnittsheader)


167

Ich möchte eine Tabellenüberschrift (keine Abschnittsüberschriften) wie in der Kontakt-App hinzufügen, zum Beispiel: Geben Sie hier die Bildbeschreibung ein

genau so - ein Etikett neben einem Bild über der Tabelle.

Ich möchte, dass die Gesamtansicht scrollbar ist, damit ich diese nicht außerhalb der Tabelle platzieren kann.

Wie kann ich das machen?

Antworten:


245

UITableViewhat eine tableHeaderViewEigenschaft. Stellen Sie das auf die gewünschte Ansicht ein.

Verwenden Sie eine neue UIViewals Container, fügen Sie dieser neuen eine Textbeschriftung und eine Bildansicht hinzu und UIViewsetzen Sie tableHeaderViewsie dann auf die neue Ansicht.

Zum Beispiel in einem UITableViewController:

-(void)viewDidLoad
{
     // ...
     UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:imageView];
     UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:labelView];
     self.tableView.tableHeaderView = headerView;
     [imageView release];
     [labelView release];
     [headerView release];
     // ...
} 

Toll! Danke, es funktioniert. Gibt es eine Eigenschaft, die Tabellenansichtszellen so groß wie den darin enthaltenen Text werden zu lassen?
Assaf b

Dazu müssen Sie in der Lage sein, die Höhe der Zelle anhand einer Zeichenfolge zu berechnen und diesen Wert für heightForRowAtIndexPath zu übergeben. Mit der NSString-Methode sizeWithFont: ConstrainedToSize: können Sie die Höhe des Texts ermitteln, wenn Sie auf eine Größe beschränkt sind.
Markieren Sie

Fügen Sie es nach dem Layout hinzu, oder die Größe wird nicht Ihren Wünschen entsprechen. Und viewDidLoad ist ein guter Ort.
BollMose

Ist es empfehlenswert, die Geometrie der Ansicht während der viewDidLoad-Phase festzulegen?
Nandish A

1
OK, wenn Sie die Header-Ansicht in der Tabellenquelle festlegen, scheint es zu funktionieren, stellen Sie sicher, dass Sie auch die Höhe public override UIView GetViewForHeader(UITableView tableView, nint section) { return headerView; } public override nfloat GetHeightForHeader(UITableView tableView, nint section) { return headerView.Frame.Height; }
festlegen

193

Sie können es ziemlich einfach in Interface Builder tun. Erstellen Sie einfach eine Ansicht mit einer Tabelle und legen Sie eine weitere Ansicht auf der Tabelle ab. Dies wird zur Tabellenkopfansicht. Fügen Sie dieser Ansicht Ihre Beschriftungen und Ihr Bild hinzu. Die Ansichtshierarchie finden Sie im Bild unten. Hierarchie im Interface Builder anzeigen


12
Ich bevorzuge diese Antwort, da ich Code schreibe, wenn ich ihn ordentlich einrichten und in IB positionieren kann
Besi

1
Super danke für den Hinweis. Übrigens benötigen Sie keine Bildlaufansicht in Ihrer Kopfzeile, falls sich jemand anderes wundert oder dies versucht. Es verwendet die ScrollView von UITableView für Ihren Header, da der Header technisch ein Teil von UITableView ist
Rob R.

2
Erwähnenswert ist, wie es jetzt im StoryBoard-Editor funktioniert: stackoverflow.com/q/7841167/926907
Dmitry Zaytsev

Verwenden Sie dazu keine Feder. Das Laden dauert länger. Schreiben Sie es in Code. Für die Wiederverwendbarkeit erstellen Sie eine benutzerdefinierte Klasse und instanziieren ...
Charles Robertson

1
Ich kann der Header-Ansicht keine Höhenbeschränkung hinzufügen.
Ian Warburton

14

In Swift :

override func viewDidLoad() {
    super.viewDidLoad()

    // We set the table view header.
    let cellTableViewHeader = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewHeaderCustomCellIdentifier) as! UITableViewCell
    cellTableViewHeader.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewHeaderCustomCellIdentifier]!)
    self.tableView.tableHeaderView = cellTableViewHeader

    // We set the table view footer, just know that it will also remove extra cells from tableview.
    let cellTableViewFooter = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewFooterCustomCellIdentifier) as! UITableViewCell
    cellTableViewFooter.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewFooterCustomCellIdentifier]!)
    self.tableView.tableFooterView = cellTableViewFooter
}

Wenn Sie diesen Ansatz für iOS 7 oder höher verwenden, wird eine Laufzeitwarnung ausgelöst: "Kein Indexpfad für Tabellenzellen wird wiederverwendet". Um diesen Fehler zu vermeiden, verweisen Sie auf link
baskInEminence

11

Sie können auch einfach NUR eine UIView im Interface Builder erstellen und ImageView und UILabel per Drag & Drop verschieben (damit sie wie Ihr gewünschter Header aussehen) und diese dann verwenden.

Sobald Ihr UIView so aussieht, wie Sie es auch möchten, können Sie es programmgesteuert über XIB initialisieren und zu Ihrem UITableView hinzufügen. Mit anderen Worten, Sie müssen die GESAMTE Tabelle in IB nicht entwerfen. Nur die Header-Ansicht (auf diese Weise kann die Header-Ansicht auch in anderen Tabellen wiederverwendet werden)

Zum Beispiel habe ich eine benutzerdefinierte UIView für einen meiner Tabellenheader. Die Ansicht wird von einer xib-Datei namens "CustomHeaderView" verwaltet und mit dem folgenden Code in meiner UITableViewController-Unterklasse in den Tabellenkopf geladen:

-(UIView *) customHeaderView {
    if (!customHeaderView) {
        [[NSBundle mainBundle] loadNibNamed:@"CustomHeaderView" owner:self options:nil];
    }

    return customHeaderView;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Set the CustomerHeaderView as the tables header view 
    self.tableView.tableHeaderView = self.customHeaderView;
}

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

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,30)];
    headerView.backgroundColor=[[UIColor redColor]colorWithAlphaComponent:0.5f];
    headerView.layer.borderColor=[UIColor blackColor].CGColor;
    headerView.layer.borderWidth=1.0f;

    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 5,100,20)];

    headerLabel.textAlignment = NSTextAlignmentRight;
    headerLabel.text = @"LeadCode ";
    //headerLabel.textColor=[UIColor whiteColor];
    headerLabel.backgroundColor = [UIColor clearColor];


    [headerView addSubview:headerLabel];

    UILabel *headerLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, headerView.frame.size.width-120.0, headerView.frame.size.height)];

    headerLabel1.textAlignment = NSTextAlignmentRight;
    headerLabel1.text = @"LeadName";
    headerLabel.textColor=[UIColor whiteColor];
    headerLabel1.backgroundColor = [UIColor clearColor];

    [headerView addSubview:headerLabel1];

    return headerView;

}

Hast du deine Frage nicht verstanden?
Priyam

2
Das ist falsch. Er möchte nur einen einzelnen Tabellenkopf, keinen Abschnittskopf. Die beiden Dinge sind sehr unterschiedlich. Bitte lesen Sie die Frage.
Charles Robertson
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.