Làm cách nào để thay đổi chiều cao của tiêu đề UITableView được nhóm?


88

Tôi biết cách thay đổi chiều cao của tiêu đề phần trong chế độ xem bảng. Nhưng tôi không thể tìm thấy bất kỳ giải pháp nào để thay đổi khoảng cách mặc định trước phần đầu tiên.

Ngay bây giờ tôi có mã này:

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

nhập mô tả hình ảnh ở đây



@JitendraDeore Cám ơn hướng dẫn tôi đi đúng hướng
circuitlego

Câu trả lời:


219

Trả về CGFLOAT_MINthay vì 0 cho chiều cao phần mong muốn của bạn.

Trả về 0 khiến UITableView sử dụng giá trị mặc định. Đây là hành vi không có giấy tờ. Nếu bạn trả về một số rất nhỏ, bạn sẽ nhận được một tiêu đề có chiều cao bằng không.

Swift 3:

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

Nhanh:

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

Mục tiêu-C:

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

8
Trong Swift, 'CGFLOAT_MIN' không khả dụng: hãy sử dụng CGFloat.min để thay thế.
tounaobun

4
CGFloat.min gây ra một vụ tai nạn, vì CGFloat.min trả về giá trị tiêu cực như -,0000000000001
Pavel Gatilov

2
Có lẽ đây là một con số nhỏ, nhưng CGFloat.min không phải là một con số quá nhỏ, nó là một con số âm rất lớn. Nếu bạn muốn một số lượng rất nhỏ, bạn sẽ sử dụng epsilon.
alex bird

6
Trong Swift 3, đó làCGFloat.leastNormalMagnitude
ixany

1
Lời khuyên: Không sử dụng giá trị này vào estimatedHeightForHeaderInSection, ứng dụng sẽ bị lỗi.
Pedro Paulo Amorim

27

Nếu bạn sử dụng tableViewkiểu được nhóm lại , hãy tableViewtự động đặt các thiết lập trên và dưới. Để tránh chúng và tránh cài đặt nội bộ, hãy sử dụng phương pháp ủy quyền cho đầu trang và chân trang. Không bao giờ trả về 0,0 nhưngCGFLOAT_MIN .

Objective-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;
}

Nhanh

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
}

Tôi cũng phải trả lại nil để viewForHeaderInSectiontiêu đề biến mất hoàn toàn.
Dominik Seemayr

19

Có vẻ như tôi không thể đặt chế độ xem tiêu đề bảng có chiều cao bằng 0. Tôi đã thực hiện những việc sau:

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

Điều này sẽ tốt hơn nếu đặt chiều cao tại đây:- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 1.0f; }
uniruddh

19

Điều này đã làm việc cho tôi với Swift 4 . Sửa đổi UITableViewví dụ của bạn trong 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, cảm ơn bạn đã dành thời gian đề cập đến nó ở đây :)
user2672052

13

Bạn có thể thử điều này:

bên trong loadView

_tableView.sectionHeaderHeight = 0;

Sau đó

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

Nó sẽ được xóa miễn là bạn không có bất kỳ đối tượng nào trong tiêu đề ...

Và nếu bạn muốn một số kích thước của phần tiêu đề, thì chỉ thay đổi giá trị trả về.

tương tự nếu bạn không gỡ bỏ sectionfooter.

_tableView.sectionFooterHeight = 0;

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

Chà, điều này phù hợp với các vấn đề của tôi với chế độ xem bảng trong iOS7.


3

Bạn nên xóa mã self.tableView.tableHeaderView = [UIView new];sau khi thêm

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

Đó là footerchiều cao gây ra vấn đề trong trường hợp của tôi. Cảm ơn vì sự giúp đỡ.
pkc456

2

bạn có thể sử dụng viewForHeaderInSectionvà trả lại chế độ xem với bất kỳ độ cao nào.

- (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;
    }
}

Tôi không hỏi về tiêu đề phần, mà là tiêu đề bảng.
Cirlego

thì bạn có thể chuyển trực tiếp một uiview đến chế độ xem tiêu đề bảng.
Divyam Shukla

2

Trong 2.0 nhanh chóng

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

        return yourHeight
    }

2

Trong Swift 4

Loại bỏ phần đệm thừa trên cùng trong chế độ xem bảng được nhóm.

Ở đây chiều cao được cung cấp 1 làm chiều cao tối thiểu cho tiêu đề phần vì bạn không thể đưa ra 0 vì chế độ xem bảng sẽ lấy nó làm lề trên mặc định nếu được chỉ định chiều cao bằng 0.

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

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

0

Ví dụ về 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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.