Как удалить пустое пространство в верхней части сгруппированного UITableView? - PullRequest
11 голосов
/ 30 марта 2012

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

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

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

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

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

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

Есть мысли? Заранее спасибо!

Ответы [ 8 ]

61 голосов
/ 05 марта 2014

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

Место есть из-за свойства 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.

Спасибо @liushuaikobe за проверку с использованием работы с наименьшим положительным нормальным числом.

5 голосов
/ 25 марта 2017

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

Objective-C

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

Swift

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: Double(FLT_MIN)))
2 голосов
/ 30 мая 2017

Если стиль вашего 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;
} 

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

1 голос
/ 10 ноября 2017

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

Swift

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: Double(Float.leastNormalMagnitude)))
0 голосов
/ 10 июля 2019

Ответ в Свифте 4

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

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNonzeroMagnitude
}
0 голосов
/ 29 июля 2018

Для iOS 11.0 +

tableView.contentInsetAdjustmentBehavior = .never
0 голосов
/ 16 мая 2018

Для C #:

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

       var frame = CoreGraphics.CGRect.Empty;
       frame.Height = 1;
       myTableview.TableHeaderView = new UIView(frame);
       myTableview.TableFooterView = new UIView(frame);
}
0 голосов
/ 14 ноября 2017

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

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

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
  return [[UIView alloc] initWithFrame:CGRectZero];   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...