UITableViewStylePlain을 사용하여 UITableView에서 부동 헤더를 비활성화 할 수 있습니까?


177

UITableView콘텐츠 '페이지'를 레이아웃 하기 위해를 사용하고 있습니다. 특정 이미지 등을 레이아웃하기 위해 테이블 ​​뷰의 헤더를 사용하고 있으며 플로팅하지 않았지만 스타일을로 설정할 때처럼 정적 상태를 유지하려는 경우 선호합니다 UITableViewStyleGrouped.

을 사용하는 다른 사람 UITableViewStyleGrouped이 이것을 수행하는 방법이 있습니까? 모든 셀에 여백을 추가하고 각 셀에 대한 배경보기를 비활성화해야하므로 그룹화 된 사용을 피하고 싶습니다. 레이아웃을 완전히 제어하고 싶습니다. 이상적으로는 "UITableViewStyleBareBones"이지만 문서에서 해당 옵션을 보지 못했습니다 ...

많은 감사합니다



59
테이블 스타일 UITableViewStyleGrouped를 사용하십시오 -이것은 부동 헤더를 비활성화하고 전체 질문을 읽지 않는 모든 사람들을위한 답변입니다 (나에게 일어난 일 ...).
평균 Joe

@Kasztan 이것은 제로 라인 솔루션입니다! 감사.
Lee Fastenau

답변:


27

사용자 정의 셀을 사용하여 헤더 행을 수행하여이를 위조 할 수 있어야합니다. 그러면 테이블 뷰의 다른 셀처럼 스크롤됩니다.

cellForRowAtIndexPath헤더 행일 때 올바른 셀 유형을 리턴하려면 로직을 추가해야합니다 .

섹션을 직접 관리해야합니다. 즉, 한 섹션에 모든 항목이 있고 헤더를 위조해야합니다. (헤더보기에 대해 숨겨진보기를 반환하려고 시도 할 수는 있지만 작동하는지 모르겠습니다)


11
그래 ...하지만 약간의 해킹 인 것 같습니다. 이것은 분명히 코드가 그것을하기 때문에 애플의 부분을 감독하는 것처럼 보입니다. 우리는 플래그를 설정할 수 있어야합니다.
Tricky

2
특별한 해킹없이 효과를 달성하는 올바른 방법은 아래의 답변을 확인하고 모든 섹션의 첫 번째 셀을 섹션 헤더로 관리하십시오!
Suant Anantwar

338

이것을 달성하는 가장 쉬운 방법은 다음과 같습니다.

목표 -C :

CGFloat dummyViewHeight = 40;
UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, dummyViewHeight)];
self.tableView.tableHeaderView = dummyView;
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0);

빠른:

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

섹션 헤더는 이제 일반 셀처럼 스크롤됩니다.


5
이 friggin은 매력처럼 작동합니다! 테이블 헤더 뷰 헤더가 있으면 섹션 헤더가 플로팅되지 않습니다. 그리고 적절한 콘텐츠 삽입이 테이블에 보이지 않는 헤더가 트릭을 수행합니다. 정말 감사합니다! 이 답변이 그다지 주목되지 않는 이유가 궁금합니다.
Shyam Bhat

4
아직도 믿지 마세요! 개인 API도없고, 클래스를 파지 않아도됩니다! 나는이 문제에 오랫동안 직면 해 왔으며 테이블 뷰 스크롤이 비활성화 된 상태에서 스크롤 뷰 위에 테이블 뷰를 추가하여 테이블 헤더를 정상적으로 스크롤합니다. 그러나 최근에 사과 가이 문제를 해결하기 위해 새로운 방법을 제공했는지 검색하기 시작했습니다. 그래서 나는 당신의 대답을 우연히 발견했습니다. 다시 감사
Shyam Bhat

13
내가 본 유일한 단점은 상단 헤더가 더 이상 표시되지 않는다는 것입니다 (스크롤을 통해서만 볼 수 있음). 적어도 나를 위해 그것은 표시되지 않습니다
Ruzard

5
상단의 높이를 섹션 머리글의 높이와 같은 수만큼 늘리고 동일한 수로 삽입 된 내용을 줄임으로써 테이블의 tableHeaderView를 계속 표시 할 수 있습니다.
Shyam Bhat

2
나는 이것을 다시 공표 할 수 있기를 바란다. 나는 이것이 적어도이 질문에 도달 한 세 번째이고 이것이 내 문제를 해결했다고 확신한다.
Ell Neal

252

(잘못된 테이블 스타일로 인해 누가 여기에 왔는지) 속성 관리자 또는 코드를 통해 테이블 ​​스타일을 일반에서 그룹으로 변경하십시오.

let tableView = UITableView(frame: .zero, style: .grouped)

3
이것이 바로 내가 찾던 것입니다. 감사!
ninjudd

4
"그렇지 않으면 UITableViewStyleGrouped를 사용하는 방법이 있습니까?"
Michael Peterson

27
가장 반향이 높은 것을 구현하기 전에 모든 답변을 확인하는 것이 좋습니다 :)
Tung Fam

1
이제이 사람들은 당신이 찾고 있던 답입니다. TableView StyleAttributesInspector에서도 속성을 찾을 수 있습니다.
Cristian Holdunu

4
문제는 특히 "다음 UITableViewStyleGrouped를 사용하여 다른"방법을 찾기 위해 언급
Ferdz

73

경고 :이 솔루션은 예약 된 API 메소드를 구현합니다. 이로 인해 Apple이 AppStore에 배포 할 수 있도록 앱이 승인되지 않을 수 있습니다.

내 블로그 에 섹션 헤더가 떠 다니는 개인 메소드를 설명했습니다.

기본적으로, 당신은 단지 두개의 메소드에서 서브 클래스를 UITableView만들고 리턴 해야 NO합니다 :

- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;

40
대답은 개인 API를 참조하기 때문에 다운 투표를받을 자격이 없습니다 (모두가 AppStore에 제출 할 코드를 작성하는 것은 아닙니다). 대답이 맞으면 이중 사실입니다. 이러한 메소드에 대해 NO를 리턴하는 서브 클래 싱 (또는보다 쉽게 ​​UITableView 카테고리 작성)은 헤더의 부동을 중지합니다. 이것을 공개 API로 추가하려면 버그 리포트를 제출하십시오. bugreport.apple.com
jemmons

5
앱에서 해당 기능을 구현하면 Apple이 개인 API를 사용하고 있음을 어떻게 알 수 있습니까? 그들이 아는 모든 것에서 방금 UITableView의 서브 클래스에서 메소드를 구현했으며 코드를 어셈블하지 않으면 그것을 볼 수 없으며 그렇게 쉽지 않을 것입니다. 그것은 개인 API에서 메소드를 호출하는 것이 아니라 단지 하나를 구현하는 것입니다.
Javier Soto

3
@jemmons 당신이 당신의 대답을 "개인 API가 여기에 사용됩니다"라고 표시하지 않으려면. 면책 조항 :)
kas-kad

2
"내 블로그"링크가 깨진
MartinMoizard

12
@jemmons "모두가 AppStore에 제출할 코드를 작성하는 것은 아닙니다"Appstore는 실제로 문제가되지 않습니다. 문제는 애플이 의사 소통이나 사용 중단없이 개인 API를 변경하여 앱을 손상시킬 수 있다는 것입니다. Apple이 거부하는 것보다 개인 API를 사용하지 않는 것이 더 좋은 이유입니다.
aryaxt

29

좋아, 나는 그것이 늦었다는 것을 알고 있지만 그것을해야했다. 나는 현재 작동하는 솔루션을 검색하여 10 시간을 보냈지 만 완전한 답변을 찾지 못했습니다. 힌트를 찾았지만 초보자가 이해하기 어려웠습니다. 그래서 나는 2 센트를 넣고 답을 완성해야했습니다.

몇 가지 답변에서 제안했듯이 구현 할 수있는 유일한 작업 솔루션은 테이블 뷰에 일반 셀을 삽입하고 섹션 헤더로 처리하는 것입니다. 그러나 달성하는 더 좋은 방법은 이러한 셀을 삽입하는 것입니다 모든 섹션의 행 0 이러한 방식으로 이러한 사용자 정의 비 부동 헤더를 매우 쉽게 처리 할 수 ​​있습니다.

따라서 단계는 다음과 같습니다.

  1. UITableViewStylePlain 스타일로 UITableView를 구현하십시오.

    -(void) loadView
    {
        [super loadView];
    
        UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
        tblView.delegate=self;
        tblView.dataSource=self;
        tblView.tag=2;
        tblView.backgroundColor=[UIColor clearColor];
        tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
  2. 평소와 같이 titleForHeaderInSection을 구현하십시오 (자신의 논리를 사용하여이 값을 얻을 수 있지만 표준 대리자를 사용하는 것을 선호합니다).

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. 평소와 같이 numberOfSectionsInTableView 구현

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. 평소와 같이 numberOfRowsInSection을 구현하십시오.

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    {
        int rowCount = [[cellArray objectAtIndex:section] count];
        return rowCount +1; //+1 for the extra row which we will fake for the Section Header
    }
  5. heightForHeaderInSection에서 0.0f를 반환합니다.

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.0f;
    }
  6. viewForHeaderInSection을 구현하지 마십시오. nil을 리턴하는 대신 메소드를 완전히 제거하십시오.

  7. heightForRowAtIndexPath에서 (indexpath.row == 0)인지 확인하고 섹션 머리글에 원하는 셀 높이를 반환하고 그렇지 않으면 셀 높이를 반환하십시오.

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row == 0)
        {
            return 80; //Height for the section header
        }
        else
        {
            return 70; //Height for the normal cell
        }
    }
  8. 이제 cellForRowAtIndexPath에서 if (indexpath.row == 0)을 확인하고 섹션 헤더를 원하는대로 셀을 구현하고 선택 스타일을 none으로 설정하십시오. ELSE는 일반 셀이 원하는대로 셀을 구현합니다.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
            if (cell == nil)
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
    
                cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
            }
    
            cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
    
            return cell;
        }
        else
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
    
                cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
                cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
            }
    
            cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
    
            return cell;
        }
    }
  9. 이제 willSelectRowAtIndexPath를 구현하고 indexpath.row == 0이면 nil을 반환합니다. 이렇게하면 섹션 헤더 행에 대해 didSelectRowAtIndexPath가 실행되지 않습니다.

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return nil;
        }
    
        return indexPath;
    }
  10. 마지막으로 didSelectRowAtIndexPath에서 if (indexpath.row! = 0)을 확인하고 진행하십시오.

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row != 0)
        {
            int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
    
            //Do what ever you want the selection to perform
        }
    }

이것으로 당신은 끝났습니다. 이제 완벽하게 스크롤되는 비 부동 섹션 헤더가 있습니다.


1
섹션 헤더 행을 선택할 때 컨트롤이 'didSelectRowAtIndexPath'에 도달하지 않도록 'willSelectRowAtIndexPath'를 구현했습니다.
Suant Anantwar

실제로 헤더를 선택하면 행을 접고 펼칩니다. 그러나 당신이 그렇게 할 수 있다는 것을 알고
반가워요

좋은 대답이지만 왜 'didSelectRowAtIndexPath'에서 'if (indexPath.row! = 0)'을 확인합니까? 추가로 안전해야합니까? 'willSelectRowAtIndexPath'구현으로 행이 0이 될 수 없습니다.
Glenn85

1
@ Glenn85, 답변이 늦어서 죄송합니다. 예, 추가 보안을위한 것입니다.
Suant Anantwar

28

Interface Builder에서 문제 테이블보기를 클릭하십시오.

문제 테이블 뷰

그런 다음 Attributes Inspector로 이동하여 Style Plain을 Grouped로 변경하십시오.)

쉬운


17

UITableViewStyleGrouped의 흥미로운 점은 tableView가 TableView가 아닌 셀에 스타일을 추가한다는 것입니다 .

스타일은 섹션에서 셀의 위치에 따라 다른 배경 그리기를 처리하는 UIGroupTableViewCellBackground라는 클래스로 셀에 backgroundView로 추가됩니다.

따라서 매우 간단한 해결책은 UITableViewStyleGrouped를 사용하고 테이블의 backgroundColor를 clearColor로 설정 한 다음 cellForRow에서 셀의 backgroundView를 바꾸는 것입니다.

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];

1
이것이 최고의 답변이어야합니다. 여기에 대한 블로그 게시물이 있습니다 : corecocoa.wordpress.com/2011/09/17/…
Sam

이 솔루션은 실제로 작동하지 않습니다. 나는 주변 세포에서 여분의 공간을 계속 얻습니다. 어떤 아이디어?
gsempe

2
셀의 contentView가 여전히 오른쪽으로 이동하지 않습니까?
Piotr Tomasik

15

TableView 스타일을 변경하십시오.

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

UITableView에 대한 애플 문서에 따라 :

UITableViewStylePlain- 일반 테이블 뷰입니다. 섹션 머리글이나 바닥 글은 인라인 구분 기호로 표시되며 테이블보기를 스크롤하면 플로팅됩니다.

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


5

또 다른 까다로운 방법이 있습니다. 주요 아이디어는 섹션 번호를 두 배로 늘리는 것이고 첫 번째는 headerView 만 표시하고 두 번째는 실제 셀을 표시합니다.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }
    return _rowCount;
}

그런 다음 headerInSection 대리자를 구현해야합니다.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerview;
    }
    return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerheight;
    }
    return 0;
}

이 접근 방식은 데이터 소스에도 거의 영향을 미치지 않습니다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int real_section = (int)indexPath.section / 2;
    //your code
}

다른 접근 방식과 비교하여이 방법은 테이블 뷰의 프레임 또는 contentInsets를 변경하지 않으면 서 안전합니다. 이것이 도움이되기를 바랍니다.


5

원하는 것을 얻는 가장 쉬운 방법은 테이블 스타일을 UITableViewStyleGrouped, 구분 기호 스타일을 UITableViewCellSeparatorStyleNone다음 과 같이 설정하는 것 입니다 .

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN; // return 0.01f; would work same 
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

원하는 바닥 글보기를 시도하지 말고 nil원하는 높이를 설정 한 후 머리글 높이 및 머리글보기 설정을 잊지 마십시오.


4

이것이 문제를 해결하지 못할 수도 있지만 비슷한 일을하고 싶을 때 나에게 도움이되었습니다. 머리글을 설정하는 대신 위 섹션의 바닥 글을 사용했습니다. 저를 구한 것은이 섹션이 본질적으로 작고 정적이므로 뷰의 아래쪽 아래로 스크롤되지 않았습니다.


좋은 생각이야 나는이 핵을 좋아한다.
Steve Moser

좀 웃겨 아이디어에 감사하지만 해킹은 해킹입니다. 헤더는 바닥에 떠 다니기 시작하여 실제로 문제를 해결하지 못합니다
Shyam Bhat

4

스위프트 3 이상

다음을 사용 UITableViewStyleGrouped하여 바닥 글의 높이를 간단히 사용 하고 설정하십시오.

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

1
대신 0을 반환 할 수 있습니다 .leastNormalMagnitude. 또한 구현해야합니다tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
Ilias Karim

@IliasKarim 0으로 설정하면 높이가 0이 아닙니다. 또한 viewForFooterInSection이 경우 에는 기능 을 구현할 필요가 없습니다 .
Tamás Sengel

0.leastNormalMagnitude같은 효과를 가지고 있었다. viewForFooterSection방법을 구현 해야합니다. nil을 반환해야합니다. 이것은 Xcode 11.3.1이있는 Swift 5.1에 있습니다.
Ilias Karim

3

이 문제에 접근하는 방법을 생각하면서 UITableViewStyleGrouped에 대한 매우 중요한 세부 사항을 기억했습니다. UITableView가 그룹화 된 스타일 (셀 주위의 둥근 테두리)을 구현하는 방법은 UITableView가 아닌 ​​UITableViewCells에 사용자 정의 backgroundView를 추가하는 것입니다. 각 셀에는 섹션의 위치에 따라 backgroundView가 추가됩니다 (상단 행은 섹션 경계의 위쪽 부분을 가져오고 중간 셀은 측면 경계를 가져오고 아래쪽 셀은 맨 아래 부분을 얻습니다). 따라서 일반 스타일을 원하고 셀에 대한 사용자 정의 backgroundView가없는 경우 (90 %의 경우) UITableViewStyleGrouped를 사용하고 사용자 정의 배경을 제거하면됩니다. . 다음 두 단계를 수행하면됩니다.

tableView 스타일을 UITableViewStyleGrouped로 변경하십시오. 셀을 반환하기 직전에 cellForRow에 다음 줄을 추가하십시오.

cell.backgroundView = [[[UIView alloc] initWithFrame : cell.bounds] 자동 릴리스];

그리고 그게 다야. 플로팅 헤더를 제외하고 tableView 스타일은 UITableViewStylePlain과 정확히 같습니다.

도움이 되었기를 바랍니다!


2

아마도 scrollViewDidScrolltableView contentInset에서 사용하고 현재 보이는 헤더를 기반으로 변경할 수 있습니다.

내 유스 케이스에서 작동하는 것 같습니다!

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard   let tableView = scrollView as? UITableView,
            let visible = tableView.indexPathsForVisibleRows,
            let first = visible.first else {
            return
        }

        let headerHeight = tableView.rectForHeader(inSection: first.section).size.height
        let offset =  max(min(0, -tableView.contentOffset.y), -headerHeight)
        self.tableView.contentInset = UIEdgeInsetsMake(offset, 0, -offset, 0)
   }
}

1

다른 방법은 헤더를 원하는 섹션 바로 앞에 빈 섹션을 만들고 해당 섹션에 헤더를 넣는 것입니다. 섹션이 비어 있기 때문에 헤더가 즉시 스크롤됩니다.


1

위에서 하나의 섹션 (0 행)을 추가 한 다음 위의 sectionFooterView를 현재 섹션의 headerView로 설정하면 footerView가 플로팅되지 않습니다. 그것이 도움이되기를 바랍니다.


FooterView는 HeaderViews와 마찬가지로 플로팅됩니다. 화면 상단이 아니라 화면 하단에 떠 있습니다.
Mark A. Donohoe

0

XAK를 무시하십시오. 앱이 애플에 의해 받아 들여 지길 원한다면 어떤 개인적인 방법도 탐색하지 마십시오.

Interface Builder를 사용하는 경우 가장 쉽습니다. 뷰 맨 위에 UIView를 추가 한 다음 (이미지가 표시 될 위치) 그 아래에 tableview를 추가하십시오. IB는 그에 따라 크기를 조정해야합니다. 즉, 테이블 뷰의 상단은 방금 추가 한 UIView의 하단에 닿으며 높이는 나머지 화면을 덮습니다.

여기서 UIView가 실제로 테이블 뷰의 일부가 아닌 경우 테이블 뷰와 함께 스크롤되지 않습니다. 즉, tableview 헤더를 무시하십시오.

인터페이스 빌더를 사용하지 않는 경우 테이블 뷰의 위치와 높이를 정확하게 가져야하므로 조금 더 복잡합니다.


이것은 질문에 대답하지 않습니다. Tricky는 제안하는 것 같은 테이블 헤더보기가 아니라 셀 사이에있는보기 인 titleHeaderViews를 참조하고 있습니다.
Daniel Wood

0

StoryBoards : StoryBoards의 테이블 헤더보기로 헤더를 구현하는 방법에 대한 답변을 확인하십시오.

또한 구현하지 않으면

viewForHeaderInSection:(NSInteger)section

정확하게 원하는 플로팅하지 않습니다.


0

부동 섹션 헤더 섹션을 완전히 제거하려면 다음을 수행하십시오.

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] init];
}

return nil 작동하지 않습니다.

플로팅을 비활성화하지만 여전히 섹션 헤더를 표시하려면 고유 한 동작으로 사용자 정의보기를 제공 할 수 있습니다.


0

@samvermette 솔루션의 변형 :

/// Allows for disabling scrolling headers in plain-styled tableviews
extension UITableView {

    static let shouldScrollSectionHeadersDummyViewHeight = CGFloat(40)

    var shouldScrollSectionHeaders: Bool {
        set {
            if newValue {
                tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: bounds.size.width, height: UITableView.shouldScrollSectionHeadersDummyViewHeight))
                contentInset = UIEdgeInsets(top: -UITableView.shouldScrollSectionHeadersDummyViewHeight, left: 0, bottom: 0, right: 0)
            } else {
                tableHeaderView = nil
                contentInset = .zero
            }
        }

        get {
            return tableHeaderView != nil && contentInset.top == UITableView.shouldScrollSectionHeadersDummyViewHeight
        }
    }

}

0

스 니펫은 첫 번째 섹션에 대해서만 고정 헤더를 표시합니다. 다른 섹션 헤더는 셀로 플로팅됩니다.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if section == 1 {
        tableView.contentInset = .zero
    }

}

func tableView(_ tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
    if section == 0 {
        tableView.contentInset = .init(top: -tableView.sectionHeaderHeight, left: 0, bottom: 0, right: 0)
    }
}

-1

이것은 델리게이트의 viewForHeaderInSection 및 heightForHeaderInSection을 사용하는 대신 UITableViewController의 viewDidLoad 메소드에서 수동으로 헤더보기를 지정하여 수행 할 수 있습니다. 예를 들어 UITableViewController의 하위 클래스에서 다음과 같이 할 수 있습니다.

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *headerView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 40)];
    [headerView setBackgroundColor:[UIColor magentaColor]];
    [headerView setTextAlignment:NSTextAlignmentCenter];
    [headerView setText:@"Hello World"];
    [[self tableView] setTableHeaderView:headerView];
}

그러면 사용자가 스크롤하면 헤더보기가 사라집니다. 왜 이런 식으로 작동하는지 모르겠지만 원하는 것을 달성하는 것 같습니다.


이것은 섹션이 아니며 상단의 1 헤더에 대한 것입니다.
makdad

-1

헤더 뷰 배경을 투명하게 만들 수 있습니다.

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    view.tintColor = [UIColor clearColor];
}

또는 전 세계적으로 적용하십시오.

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];

-2

자동 레이아웃없이 XIB를 통해 모든 것을 수행 할 수있는 더 간단한 솔루션이 있습니다.

1 / 헤더를 테이블 뷰에 끌어다 놓아 테이블 뷰에 넣습니다.

2 / 새로 만든 헤더의 크기 관리자에서 자동 크기 조정을 변경하기 만하면 상단, 왼쪽 및 오른쪽 앵커와 채움을 수평으로 남겨 두어야합니다.

그것이 헤더에 설정되어야하는 방법입니다.

그 트릭을해야합니다!


-2

@samvermette의 답변에 따르면, 나는 코더가 신속하게 사용할 수 있도록 Swift에서 위의 코드를 구현했습니다.

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

-2

심판 : https://stackoverflow.com/a/26306212

let tableView = UITableView(frame: .zero, style: .grouped)

PLUSE

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

    return 0
}

이것은 헤더 공간을 사용하는 데 도움이되었습니다.


그렇게하지 마십시오.
MQoder

-3

2020 최신 업데이트

Xcode 14로 테스트되었습니다.

섹션 헤더를 숨기려면 섹션 대리인의 제목으로 nil을 반환하십시오.

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}

-4

tableview 델리게이트 클래스에서 viewForHeaderInSection 메소드를 구현하여이를 쉽게 수행 할 수 있습니다. 이 메소드는 UIView를 반환 객체 (헤더보기)로 예상합니다. 내 코드에서 이와 동일한 작업을 수행했습니다.


원본 포스터는 사용자 정의 헤더를 원하지 않습니다. 그들은 테이블 상단에 "부동하지"않는 헤더를 원합니다. 당신의 제안은 여전히 ​​뜬다.
jemmons

viewforheader를 사용하여 tableview를 UITableViewStyleGrouped로 변경하면 중지됩니다
mskw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.