Чи можна відключити плаваючі заголовки в UITableView за допомогою UITableViewStylePlain?


177

Я використовую UITableViewкомпонування вмісту "сторінок". Я використовую заголовки подання таблиці для компонування певних зображень і т. Д., І я вважаю за краще, якщо б вони не плавали, а залишалися статичними, як це робиться, коли встановлено стиль UITableViewStyleGrouped.

Окрім використання UITableViewStyleGrouped, є спосіб це зробити? Я хотів би уникати використання згрупованих, оскільки це додає запас усіх моїх комірок і вимагає відключення фонового виду для кожної з комірок. Я хотів би повністю контролювати свою компоновку. В ідеалі вони були б "UITableViewStyleBareBones", але я не бачив цього варіанту в документах ...

Велике дякую,



59
Використовуйте стиль таблиці UITableViewStyleGrouped - це відповідь для всіх, хто шукає відключення плаваючих заголовків і не читають усього питання (це трапилося зі мною ...).
середній Джо

@Kasztan Це рішення з нульовою лінією, яке чудово працює! Дякую.
Лі Фастенау

Відповіді:


27

Ви повинні мати можливість підробити це за допомогою користувацької комірки для виконання рядків заголовків. Потім вони будуть прокручуватися, як і будь-яка інша комірка у поданні таблиці.

Вам просто потрібно додати певну логіку, cellForRowAtIndexPathщоб повернути потрібний тип комірок, коли це заголовок.

Вам, мабуть, доведеться самостійно керувати своїми розділами, тобто мати все в одному розділі та підробляти заголовки. (Ви також можете спробувати повернути прихований вигляд для заголовка, але я не знаю, чи це спрацює)


11
Так ... хоч це здається трохи злому. Це здається наглядовою частиною Apple, так як чітко існує код для цього, нам просто потрібно мати можливість встановити прапор.
Хитрий

2
Перевірте мою відповідь нижче на правильний спосіб досягти ефекту без будь-якого спеціального злому, просто керуйте першою коміркою кожного розділу як заголовком її розділу!
Суміт Анантвар

338

Напевно, простіший спосіб досягти цього:

Завдання-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);

Швидкий:

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)

Тепер заголовки розділів прокручуватимуться так само, як і будь-яка звичайна комірка.


5
Цей фріггін працює як шарм !! Наявність заголовка перегляду заголовка таблиці зупиняє плавання заголовків розділів. А невидимий заголовок із відповідними вставками для вмісту для таблиці робить трюк .. Дякую вам дуже! цікаво, чому ця відповідь не привертає особливої ​​уваги
Шям Бхат

4
Досі не вірите! Ніяких приватних API, ніякого копання в класи, нічого! Я зіткнувся з цією проблемою протягом століть і додав перегляди таблиць поверх подань прокрутки (з вимкненим прокруткою таблиці), завдяки чому заголовки таблиць прокручуються нормально. але я тільки почав шукати, чи яблуко запропонував якісь нові методи останнім часом, щоб виправити це .. так що я радий натрапив на вашу відповідь. ще раз дякую
Shyam Bhat

13
Єдиний недолік, який я побачив, - це те, що верхній заголовок більше не відображатиметься (ви можете бачити його лише за допомогою прокрутки вгору). Принаймні для мене це не показано
Рузард

5
Ви все ще можете показати tableHeaderView таблиці, збільшивши її висоту вгорі, на число, рівне висоті заголовка розділу, і зменшити кількість вмісту, що вставляється на те саме число.
Shyam Bhat

2
Я б хотів, щоб я міг схвалити це ще раз, я абсолютно впевнений, що це принаймні втретє я закінчився цим питанням, і це вирішило мою проблему.
Елл Ніл

252

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

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

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), яка повертає НЕТ для цих методів, зупиняє плавання заголовків. Якщо ви хочете, щоб це додано як загальнодоступний 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. Реалізуйте заголовокForHeaderInSection як завжди (ви можете отримати це значення, використовуючи власну логіку, але я вважаю за краще використовувати стандартні делегати).

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. Як правило, номер виконанняOfSectionsInTableView

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. Реалізуйте номерOfRowsInSection як завжди.

    - (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 у висотуForHeaderInSection.

    - (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), і реалізуйте комірку так, як ви хочете, щоб був заголовок розділу, і встановіть стиль вибору не. ELSE реалізуйте цю клітинку так, як ви хочете, щоб вона була нормальною.

    - (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 та поверне нуль, якщо 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

Насправді я складаю + розгортаю рядки, коли вибрано заголовок. Але приємно знати, що ви можете це зробити
Ярів Ніссім

Чудова відповідь, але чому "якщо (indexPath.row! = 0)" зареєструватися в "didSelectRowAtIndexPath"? Це просто бути надзвичайно безпечним? Рядок ніколи не може бути 0 з вашою реалізацією "willSelectRowAtIndexPath", правда?
Glenn85

1
@ Glenn85, Вибачте за пізню відповідь. Так, це просто для додаткової безпеки.
Суміт Анантвар

28

У Інтерфейсі Builder натисніть на проблему Перегляд таблиці

Перегляд проблемної таблиці

Потім перейдіть до пункту «Інспектор атрибутів» та змініть «Звичайний стиль» на «Груповий»;) Легко

легко


17

Цікавим у UITableViewStyleGrouped є те, що tableView додає стиль клітинам, а не TableView.

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

Тож дуже простим рішенням буде використовувати UITableViewStyleGrouped, встановити backgroundColor таблиці на clearColor і просто замінити backgroundView комірки в cellForRow:

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

1
Це має бути головна відповідь. Про це є запис у блозі: corecocoa.wordpress.com/2011/09/17/…
Сем

Це рішення насправді не працює. Я продовжую отримувати додатковий простір біля комірок навколо. Будь-яка ідея?
gsempe

2
Невже змістView комірок все ще не буде зміщено праворуч?
Пьотр Томасик

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
}

Порівнюючи з іншими підходами, цей спосіб безпечний, не змінюючи кадру чи contentInsets таблиці. Сподіваюся, це може допомогти.


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

Хоча це може не вирішити вашу проблему, це зробило для мене, коли я хотів зробити подібну справу. Замість встановлення заголовка я застосував нижній колонтитул розділу вище. Мене врятувало те, що цей розділ малий і статичний за своєю суттю, тому він ніколи не прокручувався внизу внизу виду.


Чудова ідея. Я люблю цей хак.
Стів Мозер

якось смішно. цінуйте ідею, але хак - це хак. заголовки почнуть плавати внизу, тому насправді це не вирішує проблему
Shyam Bhat

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] автовипуск];

І це все. Стиль 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

Ще один спосіб зробити це порожній розділ прямо перед тим, на який ви хочете заголовок, і помістити заголовок на цей розділ. Оскільки розділ порожній, заголовок буде прокручено негайно.


1

Ви можете додати один розділ (з нульовими рядками) вище, а потім встановити вищезазначений розділFooterView як заголовок поточного розділуView, footerView не плаває. Сподіваюся, це дає допомогу.


FooterViews плавають, як і HeaderViews. Вони просто пливуть внизу екрана, а не вгорі.
Марк А. Донохое

0

Ігноруйте XAK. Не вивчайте жодних приватних методів, якщо ви хочете, щоб ваш додаток мав шанс прийняти Apple.

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

Мислення тут полягає в тому, що якщо цей UIView насправді не є частиною подання таблиці, він не буде прокручуватися з перегляду таблиці. тобто ігнорувати заголовок tableview.

Якщо ви не використовуєте конструктор інтерфейсів, це трохи складніше, тому що ви повинні правильно встановити позиціонування та висоту для перегляду таблиці.


Це не відповідає на запитання. Tricky посилається на titleHeaderViews - це погляди, що сидять між клітинками, а не подання заголовка таблиці, яке ви, начебто, пропонуєте.
Даніель Вуд


0

Щоб повністю видалити розділи заголовка плаваючої секції, ви можете зробити це:

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

return nil не працює.

Щоб вимкнути плаваючі, але все ще показувати заголовки розділів, ви можете надати спеціальний вид із власним поведінкою.


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)
    }
}

-1

Цього можна досягти, призначивши подання заголовка вручну методом UITableViewController''s viewDidLoad замість використання представлення представникаForHeaderInSection та висотаForHeaderInSection. Наприклад, у своєму підкласі 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 заголовка вгорі.
makdad

-1

Можливо, ви можете просто зробити фон перегляду заголовка прозорим:

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

Або застосувати це у всьому світі:

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];

-2

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

1 / Помістіть заголовок у перегляд таблиці, перетягнувши його та перетягнувши його прямо на таблицю.

2 / У Інспекторі розмірів новоспеченого заголовка просто змініть його автоматичний розмір: слід залишати лише верхній, лівий і правий кріплення, плюс заливку горизонтально.

Ось як слід встановити для заголовка

Це повинно зробити трюк!


-2

Відповідно до відповіді @ samvermette , Я реалізував вищезазначений код у 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)

-2

посилання: https://stackoverflow.com/a/26306212

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

ПЛЮС

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

    return 0
}

Це допомогло використовувати простір заголовка


Будь ласка, не робіть цього🙏
MQoder

-3

Останнє оновлення 2020 року

Тестовано з Xcode 14.

Щоб приховати будь-який заголовок розділу, поверніть нуль для заголовка розділу

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}

-4

Ви можете легко досягти цього, застосувавши метод viewForHeaderInSection у класі делегата tableview. цей метод очікує, що UIView буде повернутим об'єктом (це перегляд заголовка). Я зробив це те саме в своєму коді


Оригінальний плакат не бажає користувацького заголовка. Вони хочуть, щоб заголовок, який не "пливе" вгорі таблиці. Ваша пропозиція все ще пливе.
Джеммонс

змініть перегляд таблиці на UITableViewStyleGrouped з viewforheader, тоді він зупинить його
mskw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.