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

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

  1. делегат TableView должен реализовать метод heightForHeaderInSection

  2. в методе 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 {
        ...
    }
}

Я просто скопировал ваш код и попробовал. Он работает нормально (пробовал в симуляторе). Я прикрепил представление результата. Вы хотите такой вид, верно? Или я неправильно понял вашу проблему?

enter image description here

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 или "" in func 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
}