Скорочення простору між розділами UITableView


141

Чи є спосіб зменшити простір між двома розділами UITableView? Між кожним окремим розділом розміщується близько 15 пікселів. Я вже намагаюся повертати 0 для -tableView:heightForFooterInSection:і , -tableView:heightForHeaderInSection:але це нічого не змінює.

Будь-які пропозиції?


1
Я використовував згрупований tableView і встановлював висоту заголовка / нижнього колонтитулу на 0.0. Але він показував сіру зону з висотою 30 балів (за замовчуванням). Використання не 0.0прийнято. ви повинні використовувати будь-яке значення вище, 0.0наприклад 0.0001.
Мед

Як говорить @Honey, 0.0це не працює. У мене є більш ретельна відповідь на ту саму проблему тут: stackoverflow.com/a/22185534/2789144
Джеймс Нельсон

Відповіді:


263

Це було трохи хитро, але спробуйте цей код:

- (CGFloat)tableView:(UITableView*)tableView 
           heightForHeaderInSection:(NSInteger)section {
    if (section == 0) {
        return 6.0;
    }

    return 1.0;
}

- (CGFloat)tableView:(UITableView*)tableView 
           heightForFooterInSection:(NSInteger)section {
    return 5.0;
}

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

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

Змініть значення відповідно. Щоб видалити простір, я думаю, що 0,0 не буде прийнято. Найменше здорове значення здається 1,0.


2
Вам слід повернути 5.0f замість 5.0 через конфлікти з подвійним поплавком
LeonS

45
Ви навіть можете повернути 0,00001f як висоту, і ви отримаєте висоту 0 пікселів / очок.
Клаас

1
Як вказує @Klass, ви не можете використовувати його 0як висоту - ви отримаєте висоту за замовчуванням.
zekel

26
Чому б не використовувати CGFLOAT_MIN? Він створений для подібних сценаріїв :)
Андрій Філіп

12
Якщо скористатися швидким, ви можете повернутисяCGFloat.leastNonzeroMagnitude
oztune

140

Для всіх, хто хоче скоротити відстань до 0, вам потрібно скористатися:

tableView.sectionHeaderHeight = 0.0;
tableView.sectionFooterHeight = 0.0;

Оскільки сервірування UITableViewDelegate робить ефект лише починаючи з поплавків, більших за нуль.

-(CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section
{
    return 1.0;
}


-(CGFloat)tableView:(UITableView*)tableView heightForFooterInSection:(NSInteger)section
{
    return 1.0;
}

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

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

(за допомогою iOS 4.1 з XCode 4.0.2)


7
повернення 0,0001; працює на мене. Я використовую Xcode 4.6 і IOS 6.1
Sam

Мені потрібно лише повернути CGFLOAT_MIN у перших двох методах, і він працює добре.
Юлій

замість 0 використанняreturn .leastNormalMagnitude
квартира

33

Ви можете фактично встановити висоту підніжжя / заголовка / комірок у програмі Interface Builder на вкладці розміру. За замовчуванням заголовок / нижній колонтитул встановлено на рівні 10,0.


Я думаю, що така поведінка була додана в iOS 5.0 або iOS 6.0, але так - зараз набагато простіше встановити відстань між групами.
Влас Волошин

2
Я знаю, що це старе, але я хотів прокоментувати, що, як для XCode 5 і iOS 7, схоже, це МОЖЕ бути зроблено в коді. Я встановив його в програмі інтерфейсів на 0, і він все ще був встановлений на 1, поки я не встановив його в коді до 0.
Ахмад

З Xcode 6 та iOS 8, здається, працює лише з конфігурацією в розкадровці.
Мюррей Сагал

вони встановлені на 18 на xcode 7 за замовчуванням. але це далеко не найпростіше рішення!
static0886

27

Ви повинні зменшити висоту заголовка / колонтитулу секції. Тоді проміжок між секціями зменшиться.

спробуйте цей код

Це працює для мене :-)

tableView.sectionHeaderHeight = 2.0;
tableView.sectionFooterHeight = 2.0;

21

Ви також можете зменшити висоту нижнього колонтитулу та заголовка розділу із розгортки. У таблиці -> інспектор розміру. Перейдіть до висоти розділу.

Інспектор розміру для UITableView у розкадровці.

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


6

Для мене проблема полягала в тому, що я використовував стиль перегляду згрупованої таблиці ( UITableViewStyleGrouped). Коли я змінив його на звичайний стиль ( UITableViewStylePlain), мій tableView:heightForHeaderInSection:метод був єдиним, що визначало розмір кожного заголовка розділу.


4

Використовуйте це, можливо, 0 не буде працювати, як очікувалося

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
     return .leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

3

ОНОВЛЕННЯ ДЛЯ iOS7: Завдяки оновленню автоматичної випуску ARC, ось @Martin Stolz відредагований код.

-(CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section
{
    if(section == 0)
        return 6;
    return 1.0;
}

-(CGFloat)tableView:(UITableView*)tableView heightForFooterInSection:(NSInteger)section
{
    return 5.0;
}

-(UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
}

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

(Використання iOS7, Xcode v5.0)


0

Для мене саме ця проблема була вирішена лише за допомогою наступного коду,

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return section == 0 ? 1 : 20 // 20 is my other sections height
}

Повернення 1 для першого розділу вирішило питання.


0

Для зміни заголовка / нижнього колонтитула наступні методи повинні бути реалізовані:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

І

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat

(використовуйте відповідні методи для зміни висоти нижнього колонтитулу)

Наступний код повністю видаляє пробіли навколо розділів:

public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    return nil
}

public func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return nil
}

public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNonzeroMagnitude
}

public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return .leastNonzeroMagnitude
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.