จะเปลี่ยนความสูงของส่วนหัว UITableView ที่จัดกลุ่มได้อย่างไร


88

ฉันรู้วิธีเปลี่ยนความสูงของส่วนหัวในมุมมองตาราง แต่ฉันไม่พบวิธีแก้ไขใด ๆ ในการเปลี่ยนระยะห่างเริ่มต้นก่อนส่วนแรก

ตอนนี้ฉันมีรหัสนี้:

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

ป้อนคำอธิบายภาพที่นี่


1
stackoverflow.com/questions/5441938/…ดูลิงค์นี้…
Jitendra

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

รวดเร็ว:

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
Pavel Gatilov

2
บางทีนี่อาจเป็นเรื่องอวดดี แต่ CGFloat.min ไม่ใช่ตัวเลขที่น้อยมากมันเป็นจำนวนลบที่ใหญ่มาก หากคุณต้องการจำนวนน้อยมากคุณจะใช้ epsilon
alex bird

6
ใน Swift 3CGFloat.leastNormalMagnitude
ixany

1
แนะนำ: อย่าใช้ค่านี้estimatedHeightForHeaderInSectionแอปจะหยุดทำงาน
Pedro Paulo Amorim

27

หากคุณใช้tableViewสไตล์ที่จัดกลุ่มให้tableViewตั้งค่าการใส่ด้านบนและด้านล่างโดยอัตโนมัติ เพื่อหลีกเลี่ยงและหลีกเลี่ยงการตั้งค่าสิ่งที่ใส่เข้าไปภายในให้ใช้วิธีการมอบหมายสำหรับส่วนหัวและส่วนท้าย ไม่เคยคืน 0.0 แต่CGFLOAT_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;
}

รวดเร็ว

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
}

ฉันยังต้องคืนค่าศูนย์เพื่อviewForHeaderInSectionให้ส่วนหัวหายไปอย่างสมบูรณ์
Dominik Seemayr

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

นี้ทำงานให้ฉันกับสวิฟท์ 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
ผู้ช่วยชีวิตขอบคุณที่สละเวลามาพูดถึงที่นี่ :)
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;
}

สิ่งนี้ใช้ได้กับปัญหาของฉันกับ tableview ใน 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

จากนั้นคุณสามารถส่ง Uiview ไปยังมุมมองส่วนหัวของตารางได้โดยตรง
Divyam shukla


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;

0

สองบรรทัดนี้ก็เพียงพอแล้ว

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0
    

สำหรับฉันมันใช้งานได้ใน Xcode 12.2, iOS 14.2

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.