Как установить UITableView всегда в центр UIView?

Я хотел бы реализовать UITableView в центре UIView . Первоначально он имеет только 2 или 3 ряда. Когда пользователь добавляет больше строк, он будет расширяться в вертикальном направлении, в то время как весь контент остается в центре, как показано ниже:

введите описание изображения здесь

Можно ли это сделать с помощью UITableView ?

Это можно сделать с использованием свойства contentOffset UIScrollView .

  1. Сделайте рамку таблицы TableView сидящей в границах:

     tableView.frame = self.view.bounds; tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 
  2. Объявить метод -layoutTableView:

     - (void)layoutTableView { CGSize contentSize = tableView.contentSize; CGSize boundsSize = tableView.bounds.size; CGFloat yOffset = 0; if(contentSize.height < boundsSize.height) { yOffset = floorf((boundsSize.height - contentSize.height)/2); } tableView.contentOffset = CGPointMake(0, yOffset); } 
  3. Когда вы вызываете [tableView reloadData] , просто вызывайте [self layoutTableView] впоследствии.

Другим решением является настройка вставки содержимого табличного представления, так как решение смещения содержимого не работает для меня. Вот основная идея (вставлена ​​в пользовательский подкласс UITableView):

 - (void)reloadData { [super reloadData]; [self centerTableViewContentsIfNeeded]; } - (void)layoutSubviews { [super layoutSubviews]; [self centerTableViewContentsIfNeeded]; } - (void)centerTableViewContentsIfNeeded { CGFloat totalHeight = CGRectGetHeight(self.bounds); CGFloat contentHeight = self.contentSize.height; //If we have less content than our table frame then we can center BOOL contentCanBeCentered = contentHeight < totalHeight; if (contentCanBeCentered) { self.contentInset = UIEdgeInsetsMake(ceil(totalHeight/2.f - contentHeight/2.f), 0, 0, 0); } else { self.contentInset = UIEdgeInsetsZero; } } 

Для Swift-hearted здесь игровая площадка:

 import UIKit import Foundation import XCPlayground class CenteredTable: UITableView { override func reloadData() { super.reloadData() centerTableContentsIfNeeded() } override func layoutSubviews() { super.layoutSubviews() centerTableContentsIfNeeded() } func centerTableContentsIfNeeded() { let totalHeight = CGRectGetHeight(bounds) let contentHeight = contentSize.height let contentCanBeCentered = contentHeight < totalHeight if (contentCanBeCentered) { contentInset = UIEdgeInsets(top: ceil(totalHeight/2 - contentHeight/2), left: 0, bottom: 0, right: 0); } else { contentInset = UIEdgeInsetsZero; } } } class DataSource: NSObject, UITableViewDataSource { let items = ["Mr", "Anderson", "Welcome", "Back", "We", "Missed", "You"] func registerReusableViewsWithTable(tableView: UITableView) { tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell cell.textLabel?.text = items[indexPath.row] cell.textLabel?.textAlignment = .Center return cell } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } } let dataSource = DataSource() let table = CenteredTable(frame: CGRectMake(0, 0, 300, 800), style: UITableViewStyle.Plain) table.tableFooterView = UIView(frame: CGRectZero) let container = UIView(frame: table.frame) container.addSubview(table) dataSource.registerReusableViewsWithTable(table) table.dataSource = dataSource table.reloadData() XCPShowView("table", container) container 

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

Престижность https://stackoverflow.com/a/15026532/1847601

 - (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { CGFloat contentHeight = 0.0; for (int section = 0; section < [self numberOfSectionsInTableView: tableView]; section++) { for (int row = 0; row < [self tableView: tableView numberOfRowsInSection: section]; row++) { NSIndexPath *indexPath = [NSIndexPath indexPathForRow: row inSection: section]; contentHeight += [self tableView: tableView heightForRowAtIndexPath: indexPath]; } } return (tableView.bounds.size.height - contentHeight)/2; } - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *view = [[UIView alloc] initWithFrame: CGRectZero]; view.backgroundColor = [UIColor clearColor]; return view; } 

Swift 3

 private func hightTableView() { yourTableView.frame = CGRect(x: 0, y: Int((Int(view.frame.height) - rowHeight * yourArrayData.count) / 2), width: widthTable, height: rowHeight * yourArrayData.count) } 
  • Повторное использование ячейки не работает хорошо - TableView
  • Получение данных со всех TableViewCells
  • Программно проведите по экрану UITableViewCell?
  • Использование одного и того же View Controller для добавления, отображения и редактирования
  • UITableview в UITableviewcontroller - cellforrowatindexpath не вызван при перезагрузке
  • почему данные не заполняются в моей пользовательской ячейке просмотра таблицы ui
  • Повторная перезагрузка UICollectionData вызывает воссоздание видимой ячейки
  • Два uilabels на uitable с динамической высотой
  • Что я делаю в UITableViewController?
  • Почему метод numberOfRowsInSections: вызывается 5 раз? И числоOfSections 6 раз?
  • Сгруппированный сбой UITableView на iOS 7
  • Interesting Posts

    Почему в шаблонах iOS main.m есть оператор return и пул автозаполнения?

    THREAD 1: EXC_BREAKPOINT CALayer removeAllAnimations сообщение отправлено на освобождение

    Почему шаблон Swift UITableViewController использует аргументы опций в методе tableView cellForRowAtIndexPath?

    Предыдущее содержимое повторно используемого UICollectionViewCell кратко отображается при повторном использовании ячеек в UICollectionView

    Кэш для WKWebView

    Как рисовать стрелку с помощью Core Graphics?

    IAP выходит из строя после выпуска, но нет на стадии разработки

    изменения ориентации, когда все мои контроллеры просмотра повернуты?

    iOS Аудио визуализация с использованием AVPlayer

    Нельзя использовать один текстовый вход для другого

    Показания GWT, mgwt и сетчатки

    Как идентифицировать устройство iOS уникально, вместо использования UUID и UDID

    Некоторые ячейки UITableView исчезают после прокрутки вниз, а затем назад

    Вычислить все перестановки строки в Swift

    Не удается извлечь UIImage из CIImage с CIFilter

    Давайте будем гением компьютера.