Как удалить пустое место в верхней части сгруппированного UITableView?

Когда вы создаете стиль UITableView с стилем UITableViewStyleGrouped, он добавляет довольно много места (или "подушки" ) между фактическими табличными ячейками и границами рамки таблицы. Это пространство находится выше, внизу, слева и справа от табличных ячеек.

Вы можете изменить пространство между самими табличными ячейками:

[myTableView setSectionHeaderHeight:0];
[myTableView setSectionFooterHeight:25];

Однако даже при этом все еще существует это раздражающее пространство между верхней частью кадра и первой табличной ячейкой. Кроме того, есть тонна пространства, все еще находящаяся между левыми кадрами и табличной камерой, а также правой стороной кадра и табличной камеры.

- = - = - = - = - = - = -

В принципе, есть ли способ манипулировать этим пространством (изменить его размер)? Мое единственное решение до сих пор заключается в том, чтобы сделать размер кадра больше, чем экран, чтобы подделать программу, чтобы иметь это "пустое пространство" вне экрана, тем самым удалив его. Однако это, очевидно, не является оптимальным и ясным взломом.

Любые мысли? Спасибо заранее!

Ответ 1

Этот ответ приходит довольно поздно, но я надеюсь, что это поможет кому-то.

Пространство существует из-за свойства UITableView tableHeaderView. Когда свойство tableHeaderView nil Apple по умолчанию отображает представление. Таким образом, путь вокруг этого заключается в создании пустого представления с высотой, превышающей 0. Установка этого параметра отменяет вид по умолчанию, тем самым устраняя нежелательное пространство.

Это можно сделать в раскадровке, перетащив представление вверху tableView, а затем установив высоту представления на значение 1 или больше.

Или это можно сделать программно с помощью следующего кода:

Objective-C:

CGRect frame = CGRectZero;
frame.size.height = CGFLOAT_MIN;
[self.tableView setTableHeaderView:[[UIView alloc] initWithFrame:frame]];

Swift:

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tableView.tableHeaderView = UIView(frame: frame)

Комментарии

Как уже отмечалось, вы можете использовать это же решение для нижних колонтитулов.


Источники и Благодарности

Подробнее о свойствах tableHeaderView см. Documentation.

Благодаря @liushuaikobe для проверки использования наименьшего положительного нормального числа работает.

Ответ 2

Однолинейное решение:

Objective-C

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)];

Свифта

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: Double(FLT_MIN)))

Ответ 3

Очень хороший ответ Лешека. Но так как FLT_MIN deprecated, следующий код лучше. И используйте его в методе viewDidLoad().

Свифта

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: Double(Float.leastNormalMagnitude)))

Ответ 4

Если стиль вашего tableView равен UITableViewStyleGrouped, тогда вам нужно обратить внимание на делегат высоты раздела SectionHeader или SectionFooter, потому что это необходимо реализовать прямо в этом случае.

Возвращаемое значение не должно быть 0, даже если SectionHeader или высота SectionFooter равно 0, оно должно быть очень маленьким; попробуйте CGFLOAT_MIN.

В моем примере:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
if (section == [self.dataArray indexOfObject:self.bannerList]) {
    return 46;
}
return CGFLOAT_MIN;

}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
} 

Убедитесь, что вы реализовали эти два метода, и это значение правильно, и верхнее поле будет исправлено.

Ответ 5

Ответ в Swift 4

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

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNonzeroMagnitude
}

Ответ 6

Вам также нужно установить нижний колонтитул

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
  return 0;
}

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
  return [[UIView alloc] initWithFrame:CGRectZero];   
}

Ответ 7

Для iOS 11. 0+

tableView.contentInsetAdjustmentBehavior = .never

Ответ 8

Я решил проблему, установив tableView dataSource и делегировав, где я инициализирую tableView.

Примечание: помните, что вам может понадобиться сделать tableView ленивым для назначения при инициализации tableView.

lazy var tableView: UITableView = {
        let tableView = UITableView(frame: .zero, style: .grouped)
        tableView.separatorStyle = .none
        tableView.backgroundColor = .white
        tableView.dataSource = self
        tableView.delegate = self
        return tableView
    }()

Ответ 9

Для С#:

public override void ViewDidLoad() {
       base.ViewDidLoad();

       var frame = CoreGraphics.CGRect.Empty;
       frame.Height = 1;
       myTableview.TableHeaderView = new UIView(frame);
       myTableview.TableFooterView = new UIView(frame);
}