Сгруппированный UITableView имеет 20px дополнительного дополнения внизу
Сгруппированные представления таблиц, похоже, имеют дополнительное дополнение в нижней части iOS 6 (iOS 5 его не имеет), но я не могу найти документацию, которая предполагает, что это правильное/ожидаемое поведение.
Это также влияет на проекты-примеры, например проект SimpleTableView
в примере TableViewSuite
. Я думаю, мне пришлось изменить стиль в AppDelegate
на "сгруппированные" и обновить SDK до iOS 6, но никаких других изменений в проекте не было.
Исследование показало, что существует 10px
зарезервировано для представлений заголовка и нижнего колонтитула, а также некоторые 20px
, которые не могут быть учтены.
Нет фактических представлений верхнего или нижнего колонтитула (tableHeaderView
и tableFooterView
являются nil
, а реализация и возврат nil
, например, viewForFooterInSection
ничего не делает).
Я не могу найти значение "20" для самого TableView, хотя я, возможно, что-то пропустил.
Добавление нулевого размера для нижнего колонтитула ничего не делает, но добавление квадратного представления 1px
приводит к исчезновению дополнительного заполнения. например:.
tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0,0,1,1)];
Он занимает 1px
высоты, поэтому нижнее дополнение теперь 11px
, но это гораздо менее заметно, чем 20. И теперь установка sectionFooterHeight
на 0 приведет только к 1px
снизу пространство.
Мой вопрос: что? И как я могу полностью удалить его? Это не критически важно, но это крайне странно, нежелательно, и, насколько я могу судить, это недокументировано.
Обратите внимание: его копия прошёл вопрос с форума apple dev. Но у меня точно такая же проблема, и я не понимаю, как ее решить.
Ответы
Ответ 1
Решение @frankWhite работает отлично, но вот лучшее решение, чтобы избежать ввода 0,1, 0,001 или других, чтобы сделать его менее двусмысленным.
// Swift version
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
// remove bottom extra 20px space.
return CGFloat.min
}
// Objective-C version
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
// remove bottom extra 20px space.
return CGFLOAT_MIN;
}
Ответ 2
Вы можете использовать contentInset
для компенсации дополнительного нижнего поля 20px:
tableView.contentInset = UIEdgeInsetsMake(0, 0, -20, 0);
Ответ 3
в Swift 3
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
Ответ 4
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return 0.01;
}
Это работает для меня
Ответ 5
Это единственное работающее решение, которое я думаю. Я попытался установить tableFooterView
и tableHeaderView
на nil
.
Но ничего не произошло. Затем работало следующее решение. Возврат нулевого "return 0;" не имеет эффекта. Мы должны вернуть минимально возможную высоту.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
Примечание:
Это то, что я получил при печати значений.
CGFLOAT_MAX = 340282346638528859811704183484516925440.000000
CGFLOAT_MIN = 0,000000
Ответ 6
Недавно я обнаружил эту проблему и следовал решениям, опубликованным выше, но все они не работают. В моем случае у меня есть заголовок раздела с динамической высотой. Вдохновленный вышеприведенными решениями, я поставил следующий код, и проблема решена. Я надеюсь, что это может помочь.
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
return UIView()
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 0.1
}
и настройте верхний и нижний колонтитул tableView следующим образом:
tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 0.1))
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 0.1))
Ответ 7
Следующий код работает для меня
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 0;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return 0;
}
Ответ 8
Swift 3 code
class PaddingLessTableView : UITableView
{
override func layoutSubviews() {
self.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
super.layoutSubviews()
}
}
Ответ 9
это решает проблему:
Obj-C
- (CGFloat) tableView: (UITableView *) tableView heightForFooterInSection: (NSInteger) раздел { возврат 0,1; }
Swift:
override func tableView (_ tableView: UITableView, heightForFooterInSection раздел: Int) → CGFloat { возвращение 0,1
}
Ответ 10
В Swift 4.2 вы можете попробовать установить заголовок таблицы с наименьшей нормальной высотой -
var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tableView.tableHeaderView = UIView(frame: frame)
Ответ 11
Swift 5
tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: .leastNormalMagnitude))
Ответ 12
Используйте свойство bounces
для UIScrollView
:
[yourTableView setBounces:NO];
Это приведет к удалению того, что кажется лишним дополнением в верхней и нижней части вашего UITableView
.
Фактически, он просто отключит прокруткуviewview для просмотра прокрутки за краем содержимого.