Как изменить высоту сгруппированного заголовка UITableView?


88

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

Прямо сейчас у меня есть этот код:

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

введите описание изображения здесь



@JitendraDeore Спасибо за то, что направили меня в правильном направлении
circuitlego

Ответы:


219

Верните CGFLOAT_MINвместо 0 для желаемой высоты секции.

Возвращение 0 заставляет UITableView использовать значение по умолчанию. Это недокументированное поведение. Если вы вернете очень маленькое число, вы фактически получите заголовок нулевой высоты.

Swift 3:

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

Swift:

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

Obj-C:

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

8
В Swift «CGFLOAT_MIN» недоступен: используйте вместо него CGFloat.min.
tounaobun

4
CGFloat.min вызывал сбой, потому что CGFloat.min возвращает отрицательное значение, например -0.0000000000001
Павел Гатилов

2
Возможно, это педантизм, но CGFloat.min - это не очень маленькое число, это очень большое отрицательное число. Если вам нужно очень маленькое число, вы должны использовать эпсилон.
Alex

6
В Swift 3 этоCGFloat.leastNormalMagnitude
ixany

1
Совет: не используйте это значение estimatedHeightForHeaderInSection, приложение выйдет из строя.
Педро Пауло Аморим

27

Если вы используете сгруппированныйtableView стиль , автоматически устанавливайте верхнюю и нижнюю вставки. Чтобы избежать их и избежать установки внутренних вставок, используйте методы делегата для верхнего и нижнего колонтитула. Никогда не возвращайте 0,0, но .tableViewCGFLOAT_MIN

Цель-C

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    // Removes extra padding in Grouped style
    return CGFLOAT_MIN;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // Removes extra padding in Grouped style
    return CGFLOAT_MIN;
}

Swift

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    // Removes extra padding in Grouped style
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    // Removes extra padding in Grouped style
    return CGFloat.leastNormalMagnitude
}

Мне также пришлось вернуть nil, чтобы viewForHeaderInSectionзаголовок полностью исчез.
Доминик Семайр,

19

Похоже, что я не могу установить представление заголовка таблицы с высотой 0. В итоге я сделал следующее:

- (void)viewWillAppear:(BOOL)animated{
    CGRect frame = self.tableView.tableHeaderView.frame;
    frame.size.height = 1;
    UIView *headerView = [[UIView alloc] initWithFrame:frame];
    [self.tableView setTableHeaderView:headerView];
}

Лучше установить высоту здесь:- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 1.0f; }
uniruddh

19

У меня это сработало со Swift 4 . Измените, UITableViewнапример, в viewDidLoad:

// Remove space between sections.
tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

// Remove space at top and bottom of tableView.
tableView.tableHeaderView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: CGFloat.leastNormalMagnitude)))
tableView.tableFooterView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: CGFloat.leastNormalMagnitude)))

1
Lifesaver, спасибо, что нашли время упомянуть об этом здесь :)
user2672052

13

Вы можете попробовать это:

в loadView

_tableView.sectionHeaderHeight = 0;

затем

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

Его следует удалить, пока в заголовке нет никаких объектов ...

А если вам нужен какой-то размер заголовка раздела, то измените только возвращаемое значение.

то же самое, если вы не удалили нижний колонтитул раздела.

_tableView.sectionFooterHeight = 0;

а также

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

Что ж, это работает для моих проблем с табличным представлением в iOS7.


3

Вы должны удалить код self.tableView.tableHeaderView = [UIView new];после добавления

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

В footerмоем случае проблема возникает из-за высоты. Спасибо за помощь.
pkc456

2

вы можете использовать viewForHeaderInSectionи возвращать вид с любой высотой.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{

    int height = 30 //you can change the height 
    if(section==0)
    {
       UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, height)];

       return view;
    }
}

Я спрашиваю не о заголовках разделов, а о заголовке таблицы.
circuitlego

тогда вы можете напрямую передать A uiview в представление заголовка таблицы.
Divyam shukla

2

В быстрой версии 2.0

func tableView(tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {

        return yourHeight
    }

2

В Swift 4

Удалите лишнее верхнее заполнение в сгруппированном виде таблицы.

Здесь высота задается 1 как минимальная высота для заголовка раздела, потому что вы не можете указать 0, поскольку tableview будет использовать верхнее поле по умолчанию, если ему присвоена нулевая высота.

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

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

0

Пример viewForHeaderInSection:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 118)];
view.backgroundColor = COLOR_DEFAULT;

NSString* key = [self.tableKeys objectAtIndex:section];
NSArray *result = (NSArray*)[self.filteredTableData objectForKey:key];
SZTicketsResult *ticketResult = [result objectAtIndex:0];

UIView *smallColoredView = [[UIView alloc] initWithFrame:CGRectMake(0, 5, 320, 3)];
smallColoredView.backgroundColor = COLOR_DEFAULT_KOSTKY;
[view addSubview:smallColoredView];

UIView *topBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 8, 320, 40)];
topBackgroundView.backgroundColor = [UIColor colorWithRed:255.0/255.0 green:248.0/255.0 blue:174.0/255.0 alpha:1];
[view addSubview:topBackgroundView];

UILabel *totalWinnings = [[UILabel alloc] initWithFrame:CGRectMake(10, 8, 300, 40)];
totalWinnings.text = ticketResult.message;
totalWinnings.minimumFontSize = 10.0f;
totalWinnings.numberOfLines = 0;
totalWinnings.backgroundColor = [UIColor clearColor];
totalWinnings.font = [UIFont boldSystemFontOfSize:15.0f];
[view addSubview:totalWinnings];

UIView *bottomBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 55, 320, 58)];
bottomBackgroundView.backgroundColor = [UIColor colorWithRed:255.0/255.0 green:248.0/255.0 blue:174.0/255.0 alpha:1];
[view addSubview:bottomBackgroundView];

UILabel *numberOfDraw = [[UILabel alloc] initWithFrame:CGRectMake(10, 55, 290, 58)];
numberOfDraw.text = [NSString stringWithFormat:@"sometext %@",[ticketResult.title lowercaseString]];;
numberOfDraw.minimumFontSize = 10.0f;
numberOfDraw.numberOfLines = 0;
numberOfDraw.backgroundColor = [UIColor clearColor];
numberOfDraw.font = [UIFont boldSystemFontOfSize:15.0f];
[view addSubview:numberOfDraw];

return view;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.