Поскольку дизайн представлений таблиц с использованием сгруппированного стиля значительно изменился в 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, в результате чего линия под панелью навигации будет несколько более толстой. Однако я был бы признателен, если бы кто-нибудь знал, как можно полностью скрыть заголовок первого раздела.
Обновить
Согласно анализу Каглара ( https://stackoverflow.com/a/19056823/413337 ), проблема возникает только в том случае, если представление таблицы содержится в контроллере навигации.
источник
section == 0
.Ответы:
У меня есть обходной путь, который мне кажется достаточно чистым. Итак, я отвечаю на свой вопрос.
Поскольку 0 в качестве высоты заголовка первого раздела не работает, я возвращаю 1. Затем я использую contentInset, чтобы скрыть эту высоту под панелью навигации.
Цель-C:
Swift:
источник
CGFLOAT_MIN
вместо жестко запрограммированного значения. Другими словами, не делайте этогоreturn 1.0f
или0.1f
вместо этого.return CGFLOAT_MIN
Если Apple когда-либо изменит минимально допустимое значение, вам придется изменить код, если вы жестко закодируете возвращаемое значение. Кроме того, вы уже не знаете, используете ли вы наименьшее возможное значение. Используя определенную константу, вы гарантированно будете использовать наименьшее возможное значение, и ваш код переживет изменения ОС.Вот как скрыть заголовок первого раздела в UITableView (групповой стиль).
Решение Swift 3.0 и Xcode 8.0
Делегат TableView должен реализовать метод heightForHeaderInSection
В методе heightForHeaderInSection верните наименьшее положительное число. (не ноль!)
источник
CGFLOAT_MIN
для ObjC идентичнаCGFloat.leastNonzeroMagnitude
в SwiftОтвет был очень забавным для меня и моей команды и сработал как шарм.
ПРИЧИНА:
Мы заметили, что это происходит только для первого представления в иерархии представлений, если это первое представление является UITableView . Итак, у всех других подобных UITableView нет этого раздражающего раздела, кроме первого. Мы попытались переместить UITableView с первого места в иерархии представлений, и все работало, как ожидалось.
источник
contentInset
например,{0, 64, 0, 0}
чтобы иметь смещение на 64 пикселя сверху (строка состояния плюс панель навигации). TableView должен быть прикреплен в верхней части экрана, а не topLayoutGuide (чтобы он доходил до панели навигации)Используйте этот трюк для tableView сгруппированного типа
Скопируйте и вставьте ниже код для представления таблицы в методе viewDidLoad :
источник
_tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 1)]
.это нормально.
источник
Я просто скопировал ваш код и попробовал. Работает нормально (пробовал в симуляторе). Прикрепил просмотр результатов. Вам ведь нужен такой взгляд? Или я неправильно понял вашу проблему?
источник
Swift3: heightForHeaderInSection работает с 0, вам просто нужно убедиться, что заголовок установлен на clipsToBounds.
если вы не установите clipsToBounds, скрытый заголовок будет виден при прокрутке.
источник
Обновление [19.09.17]: старый ответ больше не работает для меня в iOS 11. Спасибо, Apple. Следующие сделали:
Предыдущий ответ:
Как указано в комментариях Криса Остомо, у меня сработало следующее:
источник
Вот как избавиться от заголовка верхнего раздела в сгруппированном UITableView в Swift:
источник
В Swift 4.2 и многих более ранних версиях вместо установки высоты первого заголовка равной 0, как в других ответах, вы можете просто установить для других заголовков значение
nil
. Допустим, у вас есть два раздела, и вы хотите, чтобы только второй (т.е.1
) имел заголовок. В этом заголовке будет текст Foobar :источник
Попробуйте это, если вы хотите полностью удалить весь заголовок раздела
источник
Я пока не могу комментировать, но подумал, что добавлю, что если у вас есть
UISearchController
на вашем контроллереUISearchBar
как вашtableHeaderView
, установив высоту первой секции как 0 вheightForHeaderInSection
действительно работает.я использую
self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);
тем, что по умолчанию панель поиска скрыта.В результате для первого раздела нет заголовка, а при прокрутке вниз отображается панель поиска прямо над первой строкой.
источник
проще всего вернуться
nil
или перейти""
вfunc tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
раздел, в котором вы не хотите отображать заголовок.источник
Версия Swift: Swift 5.1
В основном вы можете установить высоту в делегате tableView следующим образом:
Иногда, когда вы создавали UITableView с помощью Xib или Storyboard, ответ up не работает. вы можете попробовать второе решение:
Надеюсь, это сработает для вас!
источник
Следующее работало для меня с iOS 13.6 и Xcode 11.6 с a,
UITableViewController
который был встроен вUINavigationController
:Никаких других уловок не требуется. Эти
override
ключевые слова не нужны , если не используетсяUITableViewController
(то есть , когда только были реализованыUITableViewDelegate
методы). Конечно, если бы целью было скрыть только заголовок первого раздела, тогда эту логику можно было бы обернуть в условное выражение как таковое:источник