UITableView พร้อมส่วนหัวคงที่


108

ทักทายฉันกำลังอ่านว่าพฤติกรรมเริ่มต้นของUITableViewคือการตรึงแถวส่วนหัวของส่วนไว้ที่ด้านบนสุดของตารางเมื่อคุณเลื่อนดูส่วนต่างๆจนกระทั่งส่วนถัดไปดันแถวส่วนเหนือออกจากมุมมอง

ฉันมีUITableViewภายในUIViewControllerและดูเหมือนจะไม่เป็นเช่นนั้น

นั่นเป็นเพียงพฤติกรรมผิดนัดเพื่อUITableViewController?

ต่อไปนี้เป็นรหัสที่เรียบง่ายตามสิ่งที่ฉันมี ฉันจะแสดงUIControllerอินเทอร์เฟซและวิธีการดูตารางแต่ละวิธีที่ฉันใช้เพื่อสร้างมุมมองตาราง ฉันมีคลาสแหล่งข้อมูลตัวช่วยที่ช่วยจัดทำดัชนีวัตถุเพื่อใช้กับตาราง

    @interface MyUIViewController ()<UITableViewDelegate, UITableViewDataSource>
        @property (nonatomic, readonly) UITableView *myTableView;
        @property (nonatomic, readonly) MyCustomHelperDataSource *helperDataSource;
    @end

    //when section data is set, get details for each section and reload table on success
    - (void)setSectionData:(NSArray *)sections {
        super.sectionData = sections; //this array drives the sections

        //get additional data for section details
        [[RestKitService sharedClient] getSectionDetailsForSection:someId 
        success:^(RKObjectRequestOperation *operation, RKMappingResult *details) {
            NSLog(@"Got section details data");
            _helperDataSource = [[MyCustomHelperDataSource alloc] initWithSections:sections andDetails:details.array];
            [myTableView reloadData];
        } failure:^(RKObjectRequestOperation *operation, NSError *error) {
            NSLog(@"Failed getting section details");
        }];
    }

    #pragma mark <UITableViewDataSource, UITableViewDelegate>

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        if (!_helperDataSource) return 0;
        return [_helperDataSource countSectionsWithDetails]; //number of section that have details rows, ignore any empty sections
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        //get the section object for the current section int
        SectionObject *section = [_helperDataSource sectionObjectForSection:section];
        //return the number of details rows for the section object at this section
        return [_helperDataSource countOfSectionDetails:section.sectionId];
    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        UITableViewCell * cell;

        NSString *CellIdentifier = @"SectionDetailCell";

        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
            cell.textLabel.font = [UIFont systemFontOfSize:12.0f];
        }

        //get the detail object for this section
        SectionObject *section = [_helperDataSource sectionObjectForSection:indexPath.section]; 

        NSArray* detailsForSection = [_helperDataSource detailsForSection:section.sectionId] ;
        SectionDetail *sd = (SectionDetail*)[detailsForSection objectAtIndex:indexPath.row];

        cell.textLabel.text = sd.displayText;
        cell.detailTextLabel.text = sd.subText;
        cell.detailTextLabel.textColor = [UIColor blueTextColor];

        return cell;
    }

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 50.0f;
}

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

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section {
    //get the section object for the current section
    SectionObject *section = [_helperDataSource sectionObjectForSection:section]; 

    NSString *title = @"%@ (%d)";

    return [NSString stringWithFormat:title, section.name, [_helperDataSource countOfSectionDetails:section.sectionId]];
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 260, 0)];
    header.autoresizingMask = UIViewAutoresizingFlexibleWidth;

    header.backgroundColor = [UIColor darkBackgroundColor];

    SSLabel *label = [[SSLabel alloc] initWithFrame:CGRectMake(3, 3, 260, 24)];
    label.font = [UIFont boldSystemFontOfSize:10.0f];
    label.verticalTextAlignment = SSLabelVerticalTextAlignmentMiddle;
    label.backgroundColor = [UIColor clearColor];
    label.text = [self tableView:tableView titleForHeaderInSection:section];
    label.textColor = [UIColor whiteColor];
    label.shadowColor = [UIColor darkGrayColor];
    label.shadowOffset = CGSizeMake(1.0, 1.0);
    [header addSubview:label];

    return header;
}

ที่ควรจะทำงาน แสดงรหัส
Matthias Bauch

นั่นเป็นวิธีที่ดีอย่างสมบูรณ์ในการใช้ UITableView และควรทำงานร่วมกับส่วนหัว ส่วนหัวไม่ได้ทำอะไรในกรณีของคุณ?
Eric

@Eric ส่วนหัวจะเลื่อนไปพร้อมกับแถว พวกเขาไม่ได้หยุดอยู่ที่ด้านบนของโต๊ะในขณะที่ฉันเลื่อน ฉันได้เพิ่มรหัสที่ฉันใช้เพื่อสร้างมุมมองตารางของฉัน มันเป็น UITableView ภายใน UIViewController
topwik

คำตอบ:


307

ส่วนหัวเท่านั้นที่ยังคงได้รับการแก้ไขเมื่อคุณสมบัติของตารางมีการตั้งค่าUITableViewStyle UITableViewStylePlainหากคุณตั้งค่าUITableViewStyleGroupedเป็นส่วนหัวจะเลื่อนขึ้นพร้อมกับเซลล์


3
สไตล์ tableview ของฉันคือ UITableViewStylePlain แต่จะเลื่อนขึ้นพร้อมกับเซลล์ด้วย
yudun1989

8
มีคำอธิบายที่เป็นไปได้สองสามข้อสำหรับสิ่งนี้ ข้อสังเกตที่สำคัญประการหนึ่งคือส่วนหัวจะคงอยู่เฉพาะสำหรับเซลล์ภายในส่วนเท่านั้น ดังนั้นหากคุณมีส่วนหัวในส่วน 0 ส่วนหัวจะไม่คงที่สำหรับเซลล์ในส่วนที่ 1 อีกคำอธิบายที่เป็นไปได้คือคุณไม่ได้เริ่มต้น UITableView ด้วยสไตล์ที่เหมาะสม ขอแนะนำให้คุณใช้initWithStyle:UITableViewStylePlainเนื่องจากการเรียกสิ่งต่างๆเช่น tableView.style = UITableViewStylePlain จะไม่ทำงาน
bachonk

UITableViewStyleGrouped ทำให้ส่วนหัว / ส่วนท้ายได้รับการแก้ไขด้วยเซลล์อื่นในขณะที่ UITableViewStylePlain ทำให้ส่วนหัว / ส่วนท้าย "ลอย" เมื่อส่วนหัว / ส่วนท้ายไปถึงด้านบน / ด้านล่างของ tableview
StoneLam

@bachonk ฉันใช้มุมมองส่วนหัวที่ยืดได้ และสไตล์ของฉันคือ UITableViewStyleGrouped ฉันต้องการแก้ไขส่วนหัวเมื่อเลื่อนขึ้น ถ้าฉันทำให้เป็น UITableViewStylePlain แล้วส่วนหัวจะได้รับการแก้ไขตรงกลางหน้าจอฉันต้องการเลื่อนส่วนหัวลง แต่เมื่อเลื่อนขึ้นฉันต้องการให้มันแก้ไขในแถวแรก .. เป็นไปได้ไหม
Gorib Developer

3

เปลี่ยนสไตล์ TableView ของคุณ:

self.tableview = [[จัดสรร UITableView] initwithFrame: รูปแบบเฟรม: UITableViewStyleGrouped];

ตามเอกสารของ Apple สำหรับ UITableView:

UITableViewStylePlain- มุมมองตารางธรรมดา ส่วนหัวหรือส่วนท้ายของส่วนใด ๆ จะแสดงเป็นตัวคั่นแบบอินไลน์และลอยเมื่อมีการเลื่อนมุมมองตาราง

UITableViewStyleGrouped- มุมมองตารางที่ส่วนต่างๆนำเสนอกลุ่มแถวที่แตกต่างกัน ส่วนหัวและส่วนท้ายไม่ลอย

หวังว่าการเปลี่ยนแปลงเล็ก ๆ นี้จะช่วยคุณได้ ..


2
สิ่งนี้ดูเหมือนจะตรงข้ามกับคำถามที่ขอ - ควรจะเป็นPlainไม่ใช่Grouped
CupawnTae

2

Swift 3.0

สร้างViewControllerกับUITableViewDelegateและUITableViewDataSourceโปรโตคอล แล้วสร้าง tableView ภายในมันประกาศรูปแบบที่จะเป็นUITableViewStyle.grouped สิ่งนี้จะแก้ไขส่วนหัว

lazy var tableView: UITableView = {
    let view = UITableView(frame: UIScreen.main.bounds, style: UITableViewStyle.grouped)
    view.delegate = self
    view.dataSource = self
    view.separatorStyle = .none
    return view
}()

0

คุณยังสามารถตั้งค่าคุณสมบัติการตีกลับของ tableview เป็น NO วิธีนี้จะทำให้ส่วนหัวของส่วนไม่ลอย / คงที่ แต่คุณจะสูญเสียคุณสมบัติการตีกลับของ tableview ด้วย


0

เพื่อให้ส่วนหัวของ UITableView ไม่เหนียวหรือเหนียว:

  1. เปลี่ยนรูปแบบของมุมมองตาราง - จัดกลุ่มเพื่อไม่ให้เหนียวและทำให้เป็นแบบธรรมดาสำหรับส่วนหัวแบบเหนียว - อย่าลืม: คุณสามารถทำได้จากสตอรีบอร์ดโดยไม่ต้องเขียนโค้ด (คลิกที่มุมมองตารางของคุณและเปลี่ยนเป็นสไตล์จากเมนูด้านขวา / ส่วนประกอบ)

  2. หากคุณมีส่วนประกอบเพิ่มเติมเช่นมุมมองที่กำหนดเองหรืออื่น ๆ โปรดตรวจสอบระยะขอบของมุมมองตารางเพื่อสร้างการออกแบบที่เหมาะสม (เช่นความสูงของส่วนหัวสำหรับส่วนและความสูงของเซลล์ที่เส้นทางดัชนีส่วน)


-2

ตอนนี้มุมมองตารางของคุณดูเหมือนสไตล์ตารางธรรมดา แต่อย่าลอยสไตล์ตารางการตั้งค่า buz ที่ตั้งเป็นกลุ่ม

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