Как удалить пустое место в верхней части сгруппированного 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);
}