Как скрыть заголовок первого раздела в 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 (https://stackoverflow.com/a/19056823/413337), проблема возникает только в том случае, если табличное представление содержится в a навигационный контроллер.
12 ответов:
у меня есть обходной путь, который кажется достаточно чистым. Так я отвечаю на свой собственный вопрос.
поскольку 0 в качестве высоты заголовка первого раздела не работает, я возвращаю 1. Тогда я использую contentInset чтобы скрыть эту высоту под панелью навигации.
Цель-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) }
это как скрыть первый заголовок раздела в UITableView (сгруппированный стиль).
Swift 3.0 & Xcode 8.0 Solution
делегат 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 }
ответ был очень смешным для меня и моей команды, и
- в Построителе интерфейса просто переместите tableview под другим видом в иерархии представлений.
причина:
мы наблюдали, что это происходит только для первого представления в иерархии представлений, если это первое представление является UITableView. Итак, все другие подобные UITableViews не имеют этого раздражающего раздела, кроме первого. Мы попытались переместить UITableView из первого места в иерархии представлений, и все работало так, как ожидалось.
используйте этот трюк для сгруппированного типа tableView
скопируйте вставить ниже код для вашего представления таблицы в viewDidLoad способ:
tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)];
этот путь в порядке.
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 { ... } }
Я просто скопировал ваш код и попробовал. Он работает нормально (пробовал в симуляторе). Я прикрепил представление результата. Вы хотите такой вид, верно? Или я неправильно понял вашу проблему?
Swift3: heightForHeaderInSection работает с 0, вы просто должны убедиться, что заголовок установлен в clipsToBounds.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 0 }
Если вы не установите clipsToBounds скрытый заголовок будет виден при прокрутке.
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { guard let header = view as? UITableViewHeaderFooterView else { return } header.clipsToBounds = true }
обновление[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);
Предыдущий Ответ:
как опубликовано в комментариях Крис Ostomo для меня сработало следующее:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return CGFLOAT_MIN; // to get rid of empty section header }
Я пока не могу комментировать, но подумал, что добавлю, что если у вас есть
UISearchController
на геймпаде сUISearchBar
в своемtableHeaderView
, установка высоты первого раздела как 0 вheightForHeaderInSection
действительно работает.я использую
self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);
так что строка поиска по умолчанию скрыта.результат заключается в том, что нет заголовка для первого раздела, и прокрутка вниз покажет строку поиска прямо над первой строкой.
самый простой на сегодняшний день, чтобы вернуться
nil
или""
infunc tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
для раздела, где вы не хотите отображать заголовок.
вот как избавиться от верхнего заголовка раздела в сгруппированном UITableView, в Swift:
tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
в Swift 4.2 и многих более ранних версиях вместо установки высоты первого заголовка в 0, как в других ответах, вы можете просто установить другие заголовки в
nil
. Скажем, у вас есть два раздела, и только второй (т. е.1
), чтобы иметь заголовок. Этот заголовок будет иметь текст Foobar:override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return section == 1 ? "Foobar" : nil }