2015-07-30 5 views
6

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

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

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

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

+0

установить рамочный стол таблицы динамически –

+4

вставить код, что еще вы пробовали? –

+0

@LalitKumar, я обновил вопрос. Благодарю. – Xchord

ответ

15

В 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) 
} 
+3

Ваши решения очень элегантны и чисты, просто не получается, если у вас есть динамическое количество ячеек. Если в вашей таблице слишком много ячеек, оно будет отображаться неправильно. Таким образом, исправлена ​​эта проблема: 'headerHeight = MAX (0, headerHeight);' –

+1

Почему бы не использовать 'self.tableView.rowHeight' вместо' ROW_HEIGHT'? –

-1

Установить кадр вашего UITableView как этот

CGFloat width = self.view.frame.size.width; 
CGFloat height = self.view.frame.size.height; 
CGFloat tableHeight = 200.0; //your table height 
self.tableView.frame = CGRectMake(0,(height-tableHeight)/2,width,tableHeight); 

или попробовать это

enter image description here

+1

Спасибо, но я не хочу менять рамку моего TableView, так как я использую автозапуск. – Xchord

+0

Я обновил свой ответ –

0

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

0

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

1

Используйте contentSize свойство UITableView, что, как вы не должны принимать Клетка 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 -data, и когда содержащий вид tableView становится видимым (viewWillAppear:), и когда он изменяет размер (viewWillTransitionToSize:withTransitionCoordinator:).

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

Swift 3 на основе Pipiks ответить

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

для СВИФТ 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 hereenter image description here enter image description hereenter image description here