it-swarm.com.de

Wie kann ich den Inhalt von UITableView vertikal ausrichten (zentrieren)?

Ich möchte den Inhalt meiner UITableView zentrieren, die headerView und footerView enthält, die im Storyboard erstellt wurden, und UITableViewCells. Wie kann ich das erreichen?

Folgendes versuche ich zu implementieren, um mein Problem zu lösen, aber das funktioniert nicht.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    CGFloat height = self.tableView.frameHeight - self.navigationController.navigationBar.frameHeight - [UIApplication sharedApplication].statusBarFrame.size.height - (self.rowCount * self.rowHeight);
    self.tableView.tableHeaderView.frameHeight = height / 2.0;
}

Deshalb habe ich die Höhe der Navigationsleiste und der Statusleiste sowie der Zellen von der Höhe des tableView abgezogen, um die Höhe des leeren Bereichs zu erhalten. Nachdem ich nun die Höhe des leeren Bereichs ermittelt habe, habe ich ihn für die Fuß- und Kopfzeilenansicht in 2 geteilt.

9
Xchord

In den Funktionen viewWillAppear und didRotateFromInterfaceOrientation :

CGFloat headerHeight = (self.view.frame.size.height - (ROW_HEIGHT * [self.tableView numberOfRowsInSection:0]))) / 2;

self.tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, -headerHeight, 0);

Dies wird Ihr Problem lösen.

EDIT

Rufen Sie die updateTableViewContentInset -Funktion in den viewWillLayoutSubviews und nach jedem reloadData auf:

Ojektiv-C

- (void)updateTableViewContentInset {
    CGFloat viewHeight = self.view.frame.size.height;
    CGFloat tableViewContentHeight = self.tableView.contentSize.height;
    CGFloat marginHeight = (viewHeight - tableViewContentHeight) / 2.0;

    self.tableView.contentInset = UIEdgeInsetsMake(marginHeight, 0, -marginHeight, 0);
}

Swift 4

func updateTableViewContentInset() {
    let viewHeight: CGFloat = view.frame.size.height
    let tableViewContentHeight: CGFloat = tableView.contentSize.height
    let marginHeight: CGFloat = (viewHeight - tableViewContentHeight) / 2.0

    self.tableView.contentInset = UIEdgeInsets(top: marginHeight, left: 0, bottom:  -marginHeight, right: 0)
}
23
Pipiks

Überschreiben Sie viewDidLayoutSubviews und vergleichen Sie die frame von tableView mit der contentSize, um die contentInset festzulegen. In Swift 4:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let tableViewHeight = self.tableView.frame.height
    let contentHeight = self.tableView.contentSize.height

    let centeringInset = (tableViewHeight - contentHeight) / 2.0
    let topInset = max(centeringInset, 0.0)

    self.tableView.contentInset = UIEdgeInsets(top: topInset, left: 0.0, bottom: 0.0, right: 0.0)
}

Dies funktioniert gut mit Tabellenansichtszellen, deren Größe sich selbst ändert.

3
Axel Guilmin

Swift 3 basierend auf der Antwort von Pipiks

let headerHeight: CGFloat = (view.frame.size.height - CGFloat(Int(tableView.rowHeight) * tableView.numberOfRows(inSection: 0))) / 2
tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, -headerHeight, 0)
2
GregP

Verwenden Sie die Eigenschaft contentSize von UITableView, damit Sie die Zelle height oder count nicht berücksichtigen müssen.

- (void) updateTableInsetsForHeight: (CGFloat) height
{
    CGFloat tableViewInset = MAX((height - self.tableView.contentSize.height) / 2.0, 0.f);
    self.tableView.contentInset = UIEdgeInsetsMake(tableViewInset, 0, -tableViewInset, 0);
}

Aktualisieren Sie die contentInsets nach dem erneuten Laden der tableView-Daten und wenn die Inhaltsansicht der tableView sichtbar wird (viewWillAppear:) und wenn sich die Größe ändert (viewWillTransitionToSize:withTransitionCoordinator:).

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [self updateTableInsetsForHeight: size.height];
}
2
Aerows

für Swift 3:

var headerHeight: CGFloat = (tableView.frame.size.height - CGFloat(Int(tableView.rowHeight) * tableView.numberOfRows(inSection: 0))) / 2
if headerHeight > 0 {
    tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, 0/*-headerHeight*/, 0)
} else {
    headerHeight = 0
    tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, 0/*-headerHeight*/, 0)
}

ERGEBNIS:

 enter image description here  enter image description here  enter image description here  enter image description here

0
dory daniel

Fügen Sie eine UIView am oberen Rand (UIView sollte übergeordnet zu Ihrer TableView sein) Ihrer TableView aus dem Storyboard hinzu. Danach legen Sie die Einschränkungen fest, um die Ansicht zu füllen. Stellen Sie nun die Größe Ihrer TableView ein und legen Sie die Einschränkungen so fest, dass Ihre obere UIView sowohl vertikal als auch horizontal zentriert ist. Dies wird Ihr Problem lösen.

0
Ersin Sezgin

Ich habe herausgefunden, warum meine Berechnung falsch ist. Der Wert von self.tableView.bounds.size.height unterscheidet sich von der tatsächlichen Höhe in viewWillAppear. Ich habe stattdessen self.view.bounds.size.height verwendet.

0
Xchord