Как скрыть заголовок первого раздела в UITableView (сгруппированный стиль)
Поскольку дизайн табличных представлений с использованием сгруппированного стиля значительно изменился с iOS 7, я хотел бы скрыть (или удалить) заголовок первого раздела. Пока мне это не удалось.
Несколько упрощенно, мой код выглядит следующим образом:
- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (section == 0)
return 0.0f;
return 32.0f;
}
- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
if (section == 0) {
UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
return view;
}
return nil;
}
- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
if (section == 0) {
return nil;
} else {
// return some string here ...
}
}
Если я верну высоту 0, другие два метода никогда не будут вызываться с индексом раздела 0. Однако пустой заголовок раздела по-прежнему выполняется с высотой по умолчанию. (В iOS 6 вызывается два метода. Однако видимый результат тот же.)
Если я возвращаю другое значение, заголовок секции получает указанную высоту.
Если я вернусь 0.01, это почти правильно. Однако, когда я включаю "Цветные несогласованные изображения" в симуляторе, он маркирует все ячейки табличного представления (что кажется логическим следствием).
Ответы на вопрос UITableView: скрыть заголовок из пустого раздела, похоже, указывают на то, что некоторым людям удалось скрыть заголовок раздела. Но это может относиться к простому стилю (вместо сгруппированного).
Лучший компромисс до сих пор возвращает высоту 0,5, что приводит к несколько более толстой линии под панелью навигации. Тем не менее, я был бы признателен, если кто-нибудь знает, как заголовок первого раздела может быть полностью скрыт.
Обновление
Согласно caglar анализу (qaru.site/info/73730/...), проблема возникает только в том случае, если таблица просмотр содержится в контроллере навигации.
Ответы
Ответ 1
У меня есть обходной путь, который кажется мне достаточно чистым. Поэтому я отвечаю на свой вопрос.
Поскольку 0 в качестве высоты заголовка первого раздела не работает, я возвращаю 1. Затем я использую contentInset, чтобы скрыть эту высоту под панелью навигации.
Objective-C:
- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (section == 0)
return 1.0f;
return 32.0f;
}
- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
if (section == 0) {
return nil;
} else {
// return some string here ...
}
}
- (void) viewDidLoad
{
[super viewDidLoad];
self.tableView.contentInset = UIEdgeInsetsMake(-1.0f, 0.0f, 0.0f, 0.0);
}
Swift:
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return section == 0 ? 1.0 : 32
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.contentInset = UIEdgeInsets(top: -1, left: 0, bottom: 0, right: 0)
}
Ответ 2
Вот как скрыть заголовок первого раздела в UITableView (сгруппированный стиль).
Swift 3.0 и решение Xcode 8.0
-
Делегат TableView должен реализовать метод heightForHeaderInSection
-
В методе heightForHeaderInSection верните наименьшее положительное число. (не ноль!)
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
let headerHeight: CGFloat
switch section {
case 0:
// hide the header
headerHeight = CGFloat.leastNonzeroMagnitude
default:
headerHeight = 21
}
return headerHeight
}
Ответ 3
Ответ был очень забавным для меня и моей команды, и работал как шарм
- В построителе интерфейсов просто переместите табличное представление под другое представление
в иерархии представлений.
ПРИЧИНА:
Мы заметили, что это происходит только для первого представления в иерархии представления, если это первое представление является UITableView. Таким образом, у всех других подобных UITableViews нет этого раздражающего раздела, кроме первого. Мы пробовали перемещать UITableView с первого места в иерархии представлений, и все работало, как ожидалось.
Ответ 4
Используйте этот трюк для группового типа tableView
Скопируйте пасту под кодом для просмотра таблицы в режиме viewDidLoad:
tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)];
Ответ 5
этот способ в порядке.
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 0 {
return CGFloat.min
}
return 25
}
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 0 {
return nil
}else {
...
}
}
Ответ 6
Я только что скопировал ваш код и попытался. Он работает нормально (в симуляторе). Я приложил результат. Вы хотите такой взгляд, верно? Или я неправильно понял вашу проблему?
![enter image description here]()
Ответ 7
Swift3: heightForHeaderInSection работает с 0, вам просто нужно удостовериться, что заголовок установлен для клипов для заголовков.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0
}
если вы не устанавливаете скрытый заголовок clipToBounds, будет отображаться при прокрутке.
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
guard let header = view as? UITableViewHeaderFooterView else { return }
header.clipsToBounds = true
}
Ответ 8
Update [9/19/17]: старый ответ для меня больше не работает в iOS 11. Спасибо Apple. Было сделано следующее:
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 20.0f;
self.tableView.contentInset = UIEdgeInsetsMake(-18.0, 0.0f, 0.0f, 0.0);
Предыдущий ответ:
Как написано в комментариях Chris Ostomo, для меня работало следующее:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return CGFLOAT_MIN; // to get rid of empty section header
}
Ответ 9
Вот как избавиться от верхнего заголовка раздела в сгруппированном UITableView, в Swift:
tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
Ответ 10
В Swift 4.2 и многих более ранних версиях вместо установки первой высоты заголовка на 0, как в других ответах, вы можете просто установить другие заголовки на nil
. Скажем, у вас есть два раздела и вы хотите, чтобы только второй (т.е. 1
) имел заголовок. Этот заголовок будет иметь текст Foobar:
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return section == 1 ? "Foobar" : nil
}
Ответ 11
Я еще не могу прокомментировать, но думал, что добавлю, что если у вас есть UISearchController
на вашем контроллере с UISearchBar
как ваш tableHeaderView
, установив высоту первого раздела как 0 в heightForHeaderInSection
действительно работают.
Я использую self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);
, чтобы строка поиска была скрыта по умолчанию.
Результат состоит в том, что заголовок для первого раздела отсутствует, а прокрутка вниз показывает строку поиска прямо над первой строкой.
Ответ 12
проще всего вернуть nil
или ""
в func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
для раздела, где вы не хотите отображать заголовок.
Ответ 13
Попробуйте это, если хотите полностью удалить весь заголовок раздела
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let tView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: tableView.bounds.width, height: CGFloat.leastNormalMagnitude)))
tView.backgroundColor = .white
return tView
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}