it-swarm.com.ru

Как выровнять (по центру) содержимое UITableView по вертикали?

Я хочу центрировать содержимое моей UITableView, которая содержит headerView и footerView, созданные на раскадровке, и UITableViewCells. Как мне этого добиться?

Вот что я пытаюсь реализовать, чтобы решить мою проблему, но это не работает.

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

Поэтому я вычел высоту панели навигации и статуса и высоту ячеек из высоты таблицы, чтобы получить высоту пустой области. Теперь, когда я получил высоту пустой области, я разделил ее на 2 для нижнего колонтитула и вид заголовка.

9
Xchord

В viewWillAppear и в didRotateFromInterfaceOrientation функции:

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

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

Это решит вашу проблему.

ПРАВКА

Вызовите функцию updateTableViewContentInset в viewWillLayoutSubviews и после каждого reloadData :

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

Переопределите viewDidLayoutSubviews и сравните frame tableView с его contentSize, чтобы установить его contentInset. В 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)
}

Это хорошо работает с ячейками представления таблицы самостоятельного размера.

3
Axel Guilmin

Swift 3 на основе ответа Пипикс

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

Используйте свойство contentSizeUITableView, чтобы не учитывать ячейку height или count.

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

Обновите contentInsets после перезагрузки tableView- данных, и когда становится видимым содержащее представление tableView (viewWillAppear:) и когда оно меняет размер (viewWillTransitionToSize:withTransitionCoordinator:).

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

для 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)
}

РЕЗУЛЬТАТ:

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

0
dory daniel

Добавьте UIView вверху (UIView должен быть родителем вашего TableView) вашего TableView из раскадровки. После этого установите его ограничения, чтобы заполнить представление. Теперь установите размер вашего TableView и установите его ограничения по центру как по вертикали, так и по горизонтали к вашей верхней части UIView. Это решит вашу проблему.

0
Ersin Sezgin

Я выяснил, что вызвало мои вычисления неправильно. Значение self.tableView.bounds.size.height отличается от фактической высоты в viewWillAppear. Вместо этого я использовал self.view.bounds.size.height.

0
Xchord