Можно ли отключить плавающие заголовки в UITableView с UITableViewStylePlain?

177

Я использую UITableViewдля разметки контента «страницы». Я использую заголовки табличного представления для размещения определенных изображений и т. Д., И я бы предпочел, чтобы они не плавали, а оставались статичными, как они делают, когда установлен стиль UITableViewStyleGrouped.

Другой, чем с помощью UITableViewStyleGrouped, есть ли способ сделать это? Я хотел бы избегать использования группировки, так как это добавляет запас по всем моим ячейкам и требует отключения фонового представления для каждой из ячеек. Я хотел бы получить полный контроль над моим макетом. В идеале они должны быть "UITableViewStyleBareBones", но я не видел эту опцию в документах ...

Большое спасибо,

запутанный
источник
59
Используйте стиль таблицы UITableViewStyleGrouped - это ответ для всех, кто ищет отключение плавающих заголовков и не читает весь вопрос (это случилось со мной ...).
среднем Джо
@Kasztan Это решение с нулевой линией, которое прекрасно работает! Спасибо.
Ли Фастенау

Ответы:

27

Вы должны иметь возможность подделать это, используя пользовательскую ячейку для создания строк заголовка. Затем они будут прокручиваться, как и любая другая ячейка в табличном представлении.

Вам просто нужно добавить некоторую логику, cellForRowAtIndexPathчтобы вернуть правильный тип ячейки, когда это строка заголовка.

Вам, вероятно, придется самостоятельно управлять своими разделами, то есть иметь все в одном разделе и подделывать заголовки. (Вы также можете попытаться вернуть скрытое представление для представления заголовка, но я не знаю, будет ли это работать)

frankodwyer
источник
11
Да ... хотя это похоже на взлом. Это похоже на упущение со стороны Apple, поскольку очевидно, что для этого существует код, нам просто нужно иметь возможность установить флаг.
Хитрый
2
Посмотрите мой ответ ниже, чтобы узнать, как правильно добиться эффекта без какого-либо специального взлома, просто укажите первую ячейку каждого раздела в качестве заголовка раздела!
Сумит Анантвар
338

Вероятно, более простой способ добиться этого:

Objective-C:

CGFloat dummyViewHeight = 40;
UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, dummyViewHeight)];
self.tableView.tableHeaderView = dummyView;
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0);

Swift:

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

Заголовки разделов теперь будут прокручиваться, как и любая обычная ячейка.

samvermette
источник
5
Этот чертовски работает как шарм! Наличие заголовка представления заголовка таблицы не дает заголовкам раздела плавать. И невидимый заголовок с соответствующими вставками содержимого для таблицы делает свое дело .. Большое спасибо! Интересно, почему этот ответ не привлекает к себе большого внимания
Шьям Бхат
4
Все еще не верьте этому! Никаких частных API, никаких копаний в классах, ничего! Я сталкивался с этой проблемой целую вечность и добавлял представления таблицы поверх представлений прокрутки (с отключенной прокруткой представления таблицы), что заставляло бы заголовки таблицы прокручиваться нормально. но только начал искать, если Apple предоставил какие-либо новые методы в последнее время, чтобы исправить это .. так рад, что наткнулся на ваш ответ. Еще раз спасибо
Shyam Bhat
13
Единственный недостаток, который я увидел, это то, что верхний заголовок больше не будет отображаться (это можно увидеть только при прокрутке вверх). По крайней мере для меня это не показано
Рузард
5
Вы все еще можете отобразить tableHeaderView таблицы, увеличив ее высоту сверху на число, равное высоте заголовка раздела, и уменьшив вставку содержимого на то же число.
Шиам Бхат
2
Хотел бы я повторить это снова, я вполне уверен, что это как минимум третий раз, когда я решаю этот вопрос, и это решило мою проблему.
Элл Нил
252

(Для тех, кто когда-либо попадал сюда из-за неправильного стиля таблицы) Измените стиль таблицы с простого на сгруппированный, с помощью инспектора атрибутов или с помощью кода:

let tableView = UITableView(frame: .zero, style: .grouped)
david72
источник
3
Это именно то, что я искал. Спасибо!
ninjudd
4
«Кроме того, используя UITableViewStyleGrouped, есть ли способ сделать это?»
Майкл Петерсон
27
Хорошо, что я научился проверять все ответы, прежде чем реализовывать самый голосующий :)
Tung Fam
1
Теперь это ребята, это ответ, который вы искали. Имейте TableView Styleв виду, что вы также можете найти это свойство в AttributesInspector.
Кристиан Холдуну
4
В этом вопросе конкретно упоминается поиск пути «Иное, чем использование UITableViewStyleGrouped»
Ferdz
73

ВНИМАНИЕ : это решение реализует зарезервированный метод API. Это может помешать Apple одобрить приложение для распространения в AppStore.

Я описал приватные методы, которые превращают заголовки разделов в мой блог.

По сути, вам просто нужно создать подкласс UITableViewи вернуться NOдвумя способами:

- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;
шайба
источник
40
Ответ не заслуживает отрицательного ответа только потому, что он ссылается на частные API (не все пишут код для отправки в AppStore). Это вдвойне верно, когда ответ оказывается правильным. Подклассы (или, проще, создание категории UITableView), которая возвращает NO для этих методов, не позволяют заголовкам плавать. Если вы хотите, чтобы это было добавлено в качестве общедоступного API, отправьте отчет об ошибке
bugreport.apple.com
5
Если мы реализуем эту функцию в приложении, как Apple узнает, что вы используете частный API? Из всего, что они знают, я просто реализовал метод в подклассе UITableView, и они даже не могут увидеть это без разборки кода, и это было бы не так просто. Это не вызов метода в частном API, это просто реализация одного ...
Хавьер Сото
3
@jemmons, если вы не хотите, чтобы я понижал ваш ответ, пометьте его как «здесь используется частный API». Вроде отказ от ответственности :)
kas-kad
2
Ссылка на «мой блог» не работает
MartinMoizard
12
@jemmons «не все пишут код для отправки в AppStore» Appstore - это не проблема. Проблема в том, что apple может изменять частные API без связи или оскорбления, что может испортить ваше приложение. Это лучшая причина того, почему вы не должны использовать частные API-интерфейсы, чем отказ от Apple
aryaxt
29

Хорошо, я знаю, что уже поздно, но я должен был это сделать. Я потратил 10 часов на поиск рабочего решения, но не нашел полного ответа. Нашел некоторые подсказки, но их трудно понять начинающим. Таким образом, я должен был вставить свои 2 цента и закончить ответ.

Как было предложено в нескольких ответах, единственное рабочее решение, которое мне удалось реализовать, - это вставить обычные ячейки в табличное представление и обработать их как заголовки разделов, но лучший способ добиться этого - вставить эти ячейки в строка 0 каждого раздела. Таким образом, мы можем легко обрабатывать эти нестандартные заголовки без плава.

Итак, шаги есть.

  1. Реализуйте UITableView со стилем UITableViewStylePlain.

    -(void) loadView
    {
        [super loadView];
    
        UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
        tblView.delegate=self;
        tblView.dataSource=self;
        tblView.tag=2;
        tblView.backgroundColor=[UIColor clearColor];
        tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
  2. Реализуйте titleForHeaderInSection как обычно (вы можете получить это значение, используя собственную логику, но я предпочитаю использовать стандартные делегаты).

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. Воплощение numberOfSectionsInTableView как обычно

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. Реализуйте numberOfRowsInSection как обычно.

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    {
        int rowCount = [[cellArray objectAtIndex:section] count];
        return rowCount +1; //+1 for the extra row which we will fake for the Section Header
    }
  5. Вернуть 0.0f в heightForHeaderInSection.

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.0f;
    }
  6. НЕ реализуйте viewForHeaderInSection. Удалите метод полностью вместо возврата ноль.

  7. В высоту ForRowAtIndexPath. Проверьте, если (indexpath.row == 0) и верните желаемую высоту ячейки для заголовка раздела, иначе верните высоту ячейки.

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row == 0)
        {
            return 80; //Height for the section header
        }
        else
        {
            return 70; //Height for the normal cell
        }
    }
  8. Теперь в cellForRowAtIndexPath, проверьте, если (indexpath.row == 0), и реализуйте ячейку так, как вы хотите, чтобы был заголовок раздела, и установите стиль выбора равным none. Иначе реализуйте ячейку так, как вы хотите, чтобы была нормальная ячейка.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
            if (cell == nil)
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
    
                cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
            }
    
            cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
    
            return cell;
        }
        else
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
    
                cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
                cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
            }
    
            cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
    
            return cell;
        }
    }
  9. Теперь реализуем willSelectRowAtIndexPath и возвращаем nil, если indexpath.row == 0. Это будет заботиться о том, чтобы didSelectRowAtIndexPath никогда не запускалось для строки заголовка раздела.

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return nil;
        }
    
        return indexPath;
    }
  10. И, наконец, в didSelectRowAtIndexPath, проверьте (indexpath.row! = 0) и продолжите.

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row != 0)
        {
            int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
    
            //Do what ever you want the selection to perform
        }
    }

С этим вы сделали. Теперь у вас есть идеально прокручиваемый, не плавающий заголовок раздела.

Сумит Анантвар
источник
1
Реализован 'willSelectRowAtIndexPath', чтобы элемент управления никогда не достигал 'didSelectRowAtIndexPath' при выборе строки заголовка раздела.
Sumit Anantwar
На самом деле, я складываю + разворачиваю строки, когда выбран заголовок. Но приятно знать, что ты можешь сделать это
Ярив Ниссим
Отличный ответ, но почему 'if (indexPath.row! = 0)' проверяет 'didSelectRowAtIndexPath'? Это просто чтобы быть особо защищенным? Строка никогда не может быть 0 с вашей реализацией willSelectRowAtIndexPath, верно?
Glenn85
1
@ Glenn85, извините за поздний ответ. Да, это просто для дополнительной безопасности.
Sumit Anantwar
28

В вашем Интерфейсном Разработчике нажмите на вашу проблему.

представление таблицы задач

Затем перейдите к Инспектору Атрибутов и измените Стиль Обычный на Сгруппированный;) Легко

легко

HannahCarney
источник
17

Интересная вещь о UITableViewStyleGrouped состоит в том, что tableView добавляет стиль к ячейкам а не в TableView.

Стиль добавляется в ячейки как backgroundView как класс с именем UIGroupTableViewCellBackground, который обрабатывает рисование различного фона в соответствии с положением ячейки в разделе.

Поэтому очень простым решением будет использовать UITableViewStyleGrouped, установить backgroundColor таблицы в clearColor и просто заменить backgroundView ячейки в cellForRow:

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];
adamsiton
источник
1
Это должен быть главный ответ. Об этом есть сообщение в блоге: corecocoa.wordpress.com/2011/09/17/…
Сэм
Это решение на самом деле не работает. Я продолжаю получать дополнительное пространство вокруг клеток. Любая идея ?
gsempe
2
Не будет ли смещение содержимого в ячейках вправо?
Петр Томасик
15

Измените ваш стиль TableView:

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

Согласно документации Apple для UITableView:

UITableViewStylePlain - простое табличное представление. Любые верхние или нижние колонтитулы отображаются в виде встроенных разделителей и плавают при прокрутке табличного представления.

UITableViewStyleGrouped - табличное представление, разделы которого представляют отдельные группы строк. Верхние и нижние колонтитулы раздела не плавают.

Акс
источник
5

Есть еще один хитрый способ. Основная идея состоит в том, чтобы удвоить номер раздела, и первый показывает только headerView, а второй показывает реальные ячейки.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }
    return _rowCount;
}

Что нужно сделать, это реализовать делегаты headerInSection:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerview;
    }
    return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerheight;
    }
    return 0;
}

Этот подход также мало влияет на ваши источники данных:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int real_section = (int)indexPath.section / 2;
    //your code
}

По сравнению с другими подходами этот способ безопасен, не изменяя фрейм или наборы содержимого табличного представления. Надеюсь, что это может помочь.

полоса дороги
источник
5

Самый простой способ получить то, что вы хотите, это установить стиль таблицы как UITableViewStyleGrouped, стиль разделителя как UITableViewCellSeparatorStyleNone:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN; // return 0.01f; would work same 
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

Не пытайтесь вернуть вид нижнего колонтитула как nil, не забудьте установить высоту заголовка и вид заголовка, после того как вы получите то, что вы хотели.

Михаил Подгородецкий
источник
4

Хотя это, возможно, не решит вашу проблему, оно помогло мне, когда я хотел сделать подобное. Вместо установки заголовка я использовал нижний колонтитул раздела выше. Что спасло меня, так это то, что этот раздел был небольшим и статичным по своей природе, поэтому он никогда не прокручивался ниже нижней части окна.

Torbjörn
источник
Отличная идея. Я люблю этот хак.
Стив Мозер
довольно забавно ценю идею, но хак это хак. заголовки начнут плавать внизу, поэтому проблема не
решится
4

Для Swift 3+

Просто используйте UITableViewStyleGroupedи установите нулевую высоту нижнего колонтитула с помощью следующего:

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
Тамас Сенгель
источник
1
Вы можете вернуть 0 вместо .leastNormalMagnitude. Также нужно реализоватьtableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
Илиас Карим
@IliasKarim Установка его в 0 означает, что он имеет ненулевую высоту. Также нет необходимости реализовывать viewForFooterInSectionфункцию в этом случае.
Тамас Сенгель
0и .leastNormalMagnitudeимел тот же эффект. Реализация viewForFooterSectionметода необходима. Вы должны вернуть ноль. Это на Swift 5.1 с Xcode 11.3.1.
Илиас Карим
3

Думая, как подойти к этой проблеме, я вспомнил очень важную деталь о UITableViewStyleGrouped. UITableView реализует сгруппированный стиль (округленные границы вокруг ячеек) путем добавления пользовательского backgroundView к UITableViewCells, а не к UITableView. В каждую ячейку добавляется backgroundView в соответствии с его положением в разделе (верхние строки получают верхнюю часть границы раздела, средние - боковую, а нижний - ну, в общем, нижнюю часть). Итак, если мы просто хотим простой стиль и у нас нет настраиваемого backgroundView для наших ячеек (что имеет место в 90% случаев), тогда все, что нам нужно сделать, это использовать UITableViewStyleGrouped и удалить собственный фон , Это можно сделать, выполнив эти два шага:

Измените наш стиль tableView на UITableViewStyleGrouped. Добавьте следующую строку в cellForRow непосредственно перед тем, как мы вернем ячейку:

cell.backgroundView = [[[UIView alloc] initWithFrame: cell.bounds] autorelease];

И это все. Стиль tableView станет точно таким же, как UITableViewStylePlain, за исключением плавающих заголовков.

Надеюсь это поможет!

Джеймс Лоренстин
источник
2

Может быть, вы могли бы использовать scrollViewDidScrollна tableView и изменить на contentInsetоснове текущего видимого заголовка.

Кажется, работает для моего случая использования!

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard   let tableView = scrollView as? UITableView,
            let visible = tableView.indexPathsForVisibleRows,
            let first = visible.first else {
            return
        }

        let headerHeight = tableView.rectForHeader(inSection: first.section).size.height
        let offset =  max(min(0, -tableView.contentOffset.y), -headerHeight)
        self.tableView.contentInset = UIEdgeInsetsMake(offset, 0, -offset, 0)
   }
}
Мартин
источник
1

Другой способ сделать это - создать пустой раздел прямо перед тем, на котором вы хотите заголовок, и поместить свой заголовок в этот раздел. Поскольку раздел пуст, заголовок будет прокручиваться немедленно.

devguydavid
источник
1

Вы можете добавить один раздел (с нулевыми строками) выше, а затем установить вышеупомянутый sectionFooterView в качестве headerView текущего раздела, footerView не плавает. Надеюсь, это поможет.

Ли Лам
источник
FooterViews плавают, как HeaderViews. Они просто плавают внизу экрана, а не сверху.
Марк А. Донохо
0

Игнорировать XAK. Не используйте частные методы, если хотите, чтобы ваше приложение было принято Apple.

Это проще всего, если вы используете Interface Builder. Вы бы добавили UIView в верхней части представления (куда будут добавляться изображения), а затем добавили свое табличное представление под ним. IB должен измерить это соответственно; то есть верхняя часть таблицы касается нижней части только что добавленного UIView, а его высота покрывает остальную часть экрана.

Мысль здесь в том, что если этот UIView на самом деле не является частью табличного представления, он не будет прокручиваться вместе с табличным представлением. т.е. игнорировать заголовок таблицы.

Если вы не используете конструктор интерфейса, это немного сложнее, потому что вы должны получить правильное расположение и высоту для таблицы.

imnk
источник
Это не отвечает на вопрос. Tricky ссылается на titleHeaderViews, которые являются представлениями, которые расположены между ячейками, а не представлением заголовка таблицы, которое, как вам кажется, предлагает.
Даниэль Вуд
0

Проверьте ответ, как реализовать заголовки с помощью StoryBoard: представления заголовков таблиц в StoryBoards

Также обратите внимание, что если вы не реализуете

viewForHeaderInSection:(NSInteger)section

это не будет плавать, что именно то, что вы хотите.

Рафаэль Оливейра
источник
0

Чтобы полностью удалить заголовки плавающей секции, вы можете сделать это:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] init];
}

return nil не работает

Чтобы отключить плавающие, но по-прежнему показывать заголовки разделов, вы можете предоставить собственное представление с собственным поведением.

djskinner
источник
0

Вариант решения @ samvermette:

/// Allows for disabling scrolling headers in plain-styled tableviews
extension UITableView {

    static let shouldScrollSectionHeadersDummyViewHeight = CGFloat(40)

    var shouldScrollSectionHeaders: Bool {
        set {
            if newValue {
                tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: bounds.size.width, height: UITableView.shouldScrollSectionHeadersDummyViewHeight))
                contentInset = UIEdgeInsets(top: -UITableView.shouldScrollSectionHeadersDummyViewHeight, left: 0, bottom: 0, right: 0)
            } else {
                tableHeaderView = nil
                contentInset = .zero
            }
        }

        get {
            return tableHeaderView != nil && contentInset.top == UITableView.shouldScrollSectionHeadersDummyViewHeight
        }
    }

}
раф
источник
0

Фрагмент отображает липкий заголовок только для первого раздела. Заголовки других разделов будут плавать с ячейками.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if section == 1 {
        tableView.contentInset = .zero
    }

}

func tableView(_ tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
    if section == 0 {
        tableView.contentInset = .init(top: -tableView.sectionHeaderHeight, left: 0, bottom: 0, right: 0)
    }
}
Adobels
источник
-1

Это может быть достигнуто путем назначения представления заголовка вручную в методе viewDidLoad UITableViewController вместо использования делегата viewForHeaderInSection и heightForHeaderInSection. Например, в вашем подклассе UITableViewController вы можете сделать что-то вроде этого:

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *headerView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 40)];
    [headerView setBackgroundColor:[UIColor magentaColor]];
    [headerView setTextAlignment:NSTextAlignmentCenter];
    [headerView setText:@"Hello World"];
    [[self tableView] setTableHeaderView:headerView];
}

Представление заголовка тогда исчезнет, ​​когда пользователь прокрутит. Я не знаю, почему это работает так, но похоже, что вы достигаете того, что вы ищете.

Джонни Ошика
источник
Это не для раздела, это для 1 заголовка вверху.
Макдад
-1

Может быть, вы можете просто сделать фон заголовка прозрачным:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    view.tintColor = [UIColor clearColor];
}

Или примените это глобально:

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];
Tinpont
источник
-2

У меня есть другое, еще более простое решение, которое можно использовать без автоматической разметки и со всем, что делается через XIB:

1 / Поместите заголовок в табличное представление, перетащив его прямо в табличное представление.

2 / В инспекторе размера вновь созданного заголовка просто измените его авторазмер: оставляйте только верхний, левый и правый якоря, а также заливку горизонтально.

Вот как это должно быть установлено для заголовка

Это должно делать свое дело !

CyberDandy
источник
-2

Согласно ответу @ samvermette , Я реализовал приведенный выше код в Swift, чтобы программистам было проще использовать swift.

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)
Bingerz
источник
-2

ссылка: https://stackoverflow.com/a/26306212

let tableView = UITableView(frame: .zero, style: .grouped)

Pluse

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return 40
    }else{
        tableView.sectionHeaderHeight = 0
    }

    return 0
}

Это помогло использовать пространство заголовка

Pratik
источник
Пожалуйста, не делай этого »
MQoder
-3

Последнее обновление 2020

Протестировано с Xcode 14.

Чтобы скрыть любой заголовок раздела, верните nil для заголовка делегата раздела.

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}
Saranjith
источник
-4

Вы можете легко добиться этого, реализовав метод viewForHeaderInSection в классе делегата tableview. этот метод ожидает UIView в качестве возвращаемого объекта (который является вашим представлением заголовка). я сделал то же самое в моем коде

Радж
источник
Оригинальный постер не хочет иметь собственный заголовок. Им нужен заголовок, который не «плавает» в верхней части таблицы. Ваше предложение все еще всплывает.
Джеммонс
измените табличное представление на UITableViewStyleGrouped с viewforheader, тогда это остановит его
mskw