Подтвердить что ты не робот

Сгруппированный UITableView имеет 20px дополнительного дополнения внизу

Сгруппированные представления таблиц, похоже, имеют дополнительное дополнение в нижней части iOS 6 (iOS 5 его не имеет), но я не могу найти документацию, которая предполагает, что это правильное/ожидаемое поведение.

Это также влияет на проекты-примеры, например проект SimpleTableView в примере TableViewSuite. Я думаю, мне пришлось изменить стиль в AppDelegate на "сгруппированные" и обновить SDK до iOS 6, но никаких других изменений в проекте не было.

Исследование показало, что существует 10px зарезервировано для представлений заголовка и нижнего колонтитула, а также некоторые 20px, которые не могут быть учтены. Нет фактических представлений верхнего или нижнего колонтитула (tableHeaderView и tableFooterView являются nil, а реализация и возврат nil, например, viewForFooterInSection ничего не делает). Я не могу найти значение "20" для самого TableView, хотя я, возможно, что-то пропустил.

Добавление нулевого размера для нижнего колонтитула ничего не делает, но добавление квадратного представления 1px приводит к исчезновению дополнительного заполнения. например:.

tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0,0,1,1)];

Он занимает 1px высоты, поэтому нижнее дополнение теперь 11px, но это гораздо менее заметно, чем 20. И теперь установка sectionFooterHeight на 0 приведет только к 1px снизу пространство.

Мой вопрос: что? И как я могу полностью удалить его? Это не критически важно, но это крайне странно, нежелательно, и, насколько я могу судить, это недокументировано.

Обратите внимание: его копия прошёл вопрос с форума apple dev. Но у меня точно такая же проблема, и я не понимаю, как ее решить.

4b9b3361

Ответ 1

Решение

@frankWhite работает отлично, но вот лучшее решение, чтобы избежать ввода 0,1, 0,001 или других, чтобы сделать его менее двусмысленным.

// Swift version
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {

    // remove bottom extra 20px space.
    return CGFloat.min
}
// Objective-C version
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {

    // remove bottom extra 20px space.
    return CGFLOAT_MIN;
} 

Ответ 2

Вы можете использовать contentInset для компенсации дополнительного нижнего поля 20px:

tableView.contentInset = UIEdgeInsetsMake(0, 0, -20, 0);

Ответ 3

в Swift 3

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

Ответ 4

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

Это работает для меня

Ответ 5

Это единственное работающее решение, которое я думаю. Я попытался установить tableFooterView и tableHeaderView на nil. Но ничего не произошло. Затем работало следующее решение. Возврат нулевого "return 0;" не имеет эффекта. Мы должны вернуть минимально возможную высоту.

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

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

Примечание: Это то, что я получил при печати значений.

CGFLOAT_MAX = 340282346638528859811704183484516925440.000000

CGFLOAT_MIN = 0,000000

Ответ 6

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

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

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

и настройте верхний и нижний колонтитул tableView следующим образом:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 0.1))
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 0.1))

Ответ 7

Следующий код работает для меня

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

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

Ответ 8

Swift 3 code

class PaddingLessTableView : UITableView
{
    override func layoutSubviews() {
        self.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        super.layoutSubviews()
    }
}

Ответ 9

это решает проблему: Obj-C - (CGFloat) tableView: (UITableView *) tableView heightForFooterInSection: (NSInteger) раздел {       возврат 0,1;   }

Swift: override func tableView (_ tableView: UITableView, heightForFooterInSection раздел: Int) → CGFloat {   возвращение 0,1 }

Ответ 10

В Swift 4.2 вы можете попробовать установить заголовок таблицы с наименьшей нормальной высотой -

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tableView.tableHeaderView = UIView(frame: frame)

Ответ 11

Swift 5

 tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: .leastNormalMagnitude))

Ответ 12

Используйте свойство bounces для UIScrollView:

[yourTableView setBounces:NO];

Это приведет к удалению того, что кажется лишним дополнением в верхней и нижней части вашего UITableView. Фактически, он просто отключит прокруткуviewview для просмотра прокрутки за краем содержимого.