Как скрыть заголовок первого раздела в 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
}