고정 섹션 헤더가있는 UITableView


107

인사드립니다.의 기본 동작은 UITableView다음 섹션이 previos 섹션 행을보기 밖으로 밀어 낼 때까지 섹션을 스크롤 할 때 섹션 머리글 행을 테이블 상단에 고정하는 것입니다.

나는 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 2013

이것은 UITableView를 사용하는 완전히 좋은 방법이며 헤더와 함께 작동해야합니다. 귀하의 경우 헤더는 무엇을하지 않습니까?
Eric

@Eric 헤더가 행과 함께 스크롤됩니다. 스크롤하는 동안 테이블 상단에서 멈추지 않습니다. 테이블 뷰를 생성하는 데 사용하는 코드를 추가했습니다. UIViewController 내부의 UITableView입니다.
topwik 2013

답변:


305

헤더 UITableViewStyle는 테이블 속성이로 설정된 경우에만 고정 된 상태로 유지 됩니다 UITableViewStylePlain. 로 설정 UITableViewStyleGrouped하면 헤더가 셀과 함께 위로 스크롤됩니다.


3
내 tableview 스타일은 UITableViewStylePlain이지만 셀과 함께 스크롤됩니다.
yudun1989 14:52에

8
이에 대한 몇 가지 가능한 설명이 있습니다. 한 가지 중요한 점은 헤더가 섹션 내의 셀에 대해서만 고정되어 있다는 것입니다. 따라서 섹션 0에 헤더가있는 경우 섹션 1의 셀에 대해 고정되지 않습니다. 또 다른 가능한 설명은 적절한 스타일로 UITableView를 초기화하지 않는다는 것입니다. initWithStyle:UITableViewStylePlaintableView.style = UITableViewStylePlain과 같은 것을 호출하면 작동하지 않으므로을 사용하는 것이 좋습니다 .
bachonk 2014-06-10

UITableViewStyleGrouped는 머리글 / 바닥 글을 다른 셀로 고정하고 UITableViewStylePlain은 머리글 / 바닥 글이 테이블보기의 상단 / 하단에 도달하면 머리글 / 바닥 글을 "부동"으로 만듭니다.
StoneLam

@bachonk 나는 신축성있는 헤더보기를 사용하고 있습니다. 내 스타일은 UITableViewStyleGrouped입니다. 위로 스크롤 할 때 헤더를 수정하고 싶습니다. UITableViewStylePlain으로 만들면 헤더가 화면 중간에 고정되고 헤더를 아래로 스크롤하고 싶지만 위로 스크롤 할 때 첫 번째 행에서 수정하고 싶습니다. 가능할까요?
Gorib 개발자

3

TableView 스타일 변경 :

self.tableview = [[UITableView 할당] initwithFrame : 프레임 스타일 : UITableViewStyleGrouped];

UITableView에 대한 Apple 문서에 따라 :

UITableViewStylePlain- 일반 테이블보기입니다. 모든 섹션 머리글 또는 바닥 글은 인라인 구분 기호로 표시되고 테이블보기를 스크롤 할 때 부동합니다.

UITableViewStyleGrouped- 섹션이 고유 한 행 그룹을 나타내는 테이블보기입니다. 섹션 머리글과 바닥 글은 부동하지 않습니다.

이 작은 변화가 도움이 되길 바랍니다 ..


2
이 질문 요청 것의 정반대로 나타납니다 - 그것은해야 Plain하지Grouped
CupawnTae

1

스위프트 3.0

UITableViewDelegateUITableViewDataSource 프로토콜을 사용하여 ViewController 를 만듭니다 . 그런 다음 내부에 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의 bounces 속성을 NO로 설정할 수도 있습니다. 이렇게하면 섹션 헤더가 부동 / 정적으로 유지되지만 테이블 뷰의 바운스 속성도 손실됩니다.


0

UITableView 섹션 헤더를 고정 또는 고정하지 않으려면 :

  1. 테이블 뷰의 스타일 변경-고정되지 않도록 그룹화하고 고정 섹션 헤더에 대해 일반화-잊지 마세요 : 코드를 작성하지 않고도 스토리 보드에서 수행 할 수 있습니다. (테이블보기를 클릭하고 오른쪽 측면 / 구성 요소 메뉴에서 스타일을 변경하십시오)

  2. 사용자 정의보기 등과 같은 추가 구성 요소가있는 경우 테이블보기의 여백을 확인하여 적절한 디자인을 만드십시오. (예 : 섹션의 헤더 높이 및 인덱스 경로, 섹션의 셀 높이)


-2

이제 tableview는 일반 테이블 스타일처럼 보이지만 buz 설정 테이블 스타일을 그룹으로 설정하지 마십시오.

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.