UITableView에서 첫 번째 섹션 헤더를 숨기는 방법 (그룹화 된 스타일)


108

그룹화 된 스타일을 사용하는 테이블보기의 디자인이 iOS 7에서 크게 변경되었으므로 첫 번째 섹션 헤더를 숨기거나 제거하고 싶습니다. 지금까지 나는 그것을 달성하지 못했습니다.

약간 단순화 된 내 코드는 다음과 같습니다.

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

- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
        return view;
    }
    return nil;
}

- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return nil;
    } else {
        // return some string here ...
    }
}

높이 0을 반환하면 다른 두 메서드는 섹션 인덱스 0으로 호출되지 않습니다. 그러나 빈 섹션 헤더는 여전히 기본 높이로 그려집니다. (iOS 6에서는 두 메서드가 호출되지만 보이는 결과는 동일합니다.)

다른 값을 반환하면 섹션 헤더는 지정된 높이를 가져옵니다.

0.01을 반환하면 거의 맞습니다. 그러나 시뮬레이터에서 "Color Misaligned Images"를 켜면 모든 테이블 뷰 셀이 표시됩니다 (논리적 인 결과 인 것 같습니다).

질문 UITableView : 빈 섹션에서 헤더 숨기기에 대한 답변 은 일부 사람들이 섹션 헤더를 숨기는 데 성공했음을 나타내는 것 같습니다. 그러나 일반 스타일 (그룹화 된 스타일 대신)에 적용될 수 있습니다.

지금까지 가장 좋은 절충안은 높이 0.5를 반환하여 내비게이션 막대 아래에 약간 더 두꺼운 선을 만드는 것입니다. 그러나 누군가가 첫 번째 섹션 헤더를 완전히 숨길 수있는 방법을 알고 있다면 감사하겠습니다.

최신 정보

caglar 의 분석 ( https://stackoverflow.com/a/19056823/413337 ) 에 따르면 테이블보기가 탐색 컨트롤러에 포함 된 경우에만 문제가 발생합니다.


나는 그 부분을 얻지 못했다 => if (section == 0) return view; 반환 없음; 즉, 첫 번째 섹션 일 때 뷰를 반환하고 그렇지 않으면 nil을 반환합니까?
Zen

아이디어는 첫 번째 섹션에 대해 높이가 0 인 뷰를 반환하고 다른 모든 섹션에 대해 nil 을 반환 하여 테이블 뷰가 기본 헤더 뷰를 사용하도록하는 것입니다. 전무의 부분은 잘 작동; 테이블보기에는 이러한 섹션의 헤더가 표시됩니다. 그러나 섹션 0의 부분은 메서드가으로 호출되지 않기 때문에 관련이 없습니다 section == 0.
Codo

1
이 대답은 짧고 달콤 해 보입니다. stackoverflow.com/a/23955420/3965
Mr Rogers

답변:


154

나에게 합리적으로 깨끗한 해결 방법이 있습니다. 그래서 저는 제 질문에 답하고 있습니다.

첫 번째 섹션 헤더의 높이로 0이 작동하지 않기 때문에 1을 반환합니다. 그런 다음 contentInset 을 사용하여 해당 높이를 탐색 모음 아래에 숨 깁니다.

목표 -C :

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

- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return nil;
    } else {
        // return some string here ...
    }
}

- (void) viewDidLoad
{
    [super viewDidLoad];

     self.tableView.contentInset = UIEdgeInsetsMake(-1.0f, 0.0f, 0.0f, 0.0);
}

빠른:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return section == 0 ? 1.0 : 32
}

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.contentInset = UIEdgeInsets(top: -1, left: 0, bottom: 0, right: 0)
}

6
헤더 높이 0.1f를 사용하는 것이 숨기기에 훨씬 좋습니다.
Chuck Krutsinger 2013

4
0.1f를 사용해 보았습니다. 그러나 그 결과 드로잉이 더 이상 픽셀에 정렬되지 않아서 흐려지고 성능이 저하됩니다. 시뮬레이터에서 시도해보십시오. 문제가있는 정렬을 강조하는 옵션이 있습니다.
Codo

31
실제로 더 나은 구현 (미래에 중단 될 가능성이 적음)은 CGFLOAT_MIN하드 코딩 된 값 대신 사용하는 것입니다. 즉,하지 return 1.0f또는 0.1f대신에, return CGFLOAT_MIN만약 애플이 지금까지 최소 허용 값을 변경, 당신은 변화에 만약 당신이 하드 코드 반환 값을 코드를해야합니다. 또한 가능한 가장 작은 값을 사용하고 있는지 이미 알지 못합니다. 정의 된 상수를 사용하면 가능한 한 가장 작은 값을 사용할 수 있으며 코드는 OS 변경에도 적용됩니다.
Chris Ostmo 2014

11
@Chris : 나는 당신이 아이디어를 얻지 못한 것 같습니다. 매우 작은 값을 반환하지 않고 픽셀 크기의 배수를 반환하여 그림이 픽셀 정렬 상태를 유지하도록합니다 (좋은 성능과 선명도를 위해). 그런 다음 콘텐츠 삽입을 사용하여 오프셋합니다. 이것은 OS가 무시할 수있는 것이 아니라 상당한 가시 거리이기 때문에 미래에 변경되지 않을 것입니다.
Codo

8
+1 UI 오프셋으로 분수 픽셀 값을 사용하지 않습니다.
Ricardo Sanchez-Saez

52

UITableView (그룹화 된 스타일)에서 첫 번째 섹션 헤더를 숨기는 방법입니다.

Swift 3.0 및 Xcode 8.0 솔루션

  1. TableView의 대리자는 heightForHeaderInSection 메서드를 구현해야합니다.

  2. heightForHeaderInSection 메서드 내에서 최소 양수를 반환합니다. (0이 아닙니다!)

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    
        let headerHeight: CGFloat
    
        switch section {
        case 0:
            // hide the header
            headerHeight = CGFloat.leastNonzeroMagnitude
        default:
            headerHeight = 21
        }
    
        return headerHeight
    }
    

6
0 대신 CGFloat.leastNonzeroMagnitude를 반환하면 도움이되었습니다. 감사!
anoo_radha

완벽한 답변, 감사합니다
피에르

그건 그렇고, CGFLOAT_MINfor objcSwiftCGFloat.leastNonzeroMagnitude 에서와 동일합니다
DawnSong

36

대답은 저와 제 팀에게 매우 재미 있었고 매력처럼 작동했습니다.

  • Interface Builder에서 뷰 계층 구조의 다른 뷰 아래로 테이블 뷰를 이동하십시오.

이유:

이 첫 번째 뷰가 UITableView 인 경우 뷰 계층 구조의 첫 번째 뷰에 대해서만 이런 일이 발생 하는 것을 관찰했습니다 . 따라서 다른 모든 유사한 UITableView에는 첫 번째를 제외하고는이 성가신 섹션이 없습니다. UITableView를 뷰 계층 구조의 첫 번째 위치로 옮기려고 시도했으며 모든 것이 예상대로 작동했습니다.


1
테이블보기를 스크롤 할 때 탐색 막대의 젖빛 유리 효과가 여전히 있습니까?
Codo

그에 따라 tableView를 설정할 때이 흐림 효과가 있습니다. contentInset{0, 64, 0, 0}를 들어 상단에서 64px 오프셋 (상태 표시 줄과 탐색 표시 줄)을 갖도록를 로 설정해야합니다 . tableView는 topLayoutGuide가 아닌 화면 상단에 첨부되어야합니다 (탐색 막대 아래에 도달 할 수 있도록 함)
Julian F. Weinert

풀을 사용하여 새로 고치지 않으면 괜찮아 보일 것입니다.
Michael

2
와. 이것은 iOS 9에서 나를 위해 일했으며 내 마음을 사로 잡았습니다.
할당

이것은 받아 들여진 대답이어야합니다. 그런 이상한 버그!
Oded Harth

25

그룹화 된 유형 tableView에이 트릭을 사용하십시오.

viewDidLoad 메서드 에서 테이블보기에 대한 코드 아래에 붙여 넣기를 복사합니다 .

tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)];

나는 그것을 시도하지 않았지만이 솔루션은 다른 제안 된 솔루션 중 일부와 동일한 단점이 있다고 생각합니다. 그림이 더 이상 픽셀에 정렬되지 않아서 흐려지고 성능이 저하됩니다. 시뮬레이터는이를 드러 낼 수 있습니다 : 문제가있는 정렬을 강조하는 옵션이 있습니다. 그러나 0으로 반올림하면 실제로 좋은 솔루션입니다.
Codo

예, 0으로 반올림 한 것 같습니다. 여러 번 사용했지만 그림에서 흐릿한 부분이 발견되지 않았기 때문입니다.
Nitesh Borad

TableHeaderView 및 섹션 헤더보기? 의 차이는 무엇인가
AsifHabib

또는 약간 더 짧게 : _tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 1)].
mojuba

@AsifHabib : tableHeaderView는 모든 테이블 요소의 맨 위에 있습니다. 테이블 자체에 대한 헤더보기입니다. 그리고 섹션 헤더 뷰는 각 섹션에 배치되는 뷰입니다. 테이블의 지정된 섹션 수에 따라 여러 섹션 헤더보기가있을 수 있습니다. 그러나 테이블 헤더보기는 하나만 있습니다.
Nitesh 역기전력 정보를 이용하여, 고성 능

21

이 방법은 괜찮습니다.

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

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 0 {
        return nil
    }else {
        ...
    }
}

2
이것은 분수 값을 사용하는 것을 제외하고는 내 솔루션의 멋진 변형입니다. 이렇게하면 텍스트와 이미지가 더 이상 픽셀에 정렬되지 않고 그리기 속도가 느려지고 결과가 흐릿해질 수 있습니다. 시뮬레이터에는이 문제를 나타 내기 위해 "색상이 잘못 정렬 된 이미지"옵션이 있습니다.
코도

containerView 정적 세포를 사용하는 나 같은 사람들을 위해 잘 작동
의 Thibaut 노아

3
Swift 3> 'CGFloat.min'이 'CGFloat.leastNormalMagnitude'로 이름이 변경되었습니다.
rjobidon

6

방금 코드를 복사하고 시도했습니다. 정상적으로 실행됩니다 (시뮬레이터에서 시도). 결과보기를 첨부했습니다. 그런 견해를 원 하시죠? 아니면 당신의 문제를 오해 했습니까?

여기에 이미지 설명 입력


1
예, 기본적으로 테이블 뷰가 내비게이션 컨트롤러에 있다는 점을 제외하면 기본적으로 원하는 것입니다. 그것이 차이를 만들 수 있습니까?
Codo

2
내비게이션 컨트롤러에 tableView를 추가했는데 상황이 나타납니다. iOS 7에서는이 헤더 높이가 그룹화 된 스타일 테이블보기에서 기본적으로 수정됩니다. tableView의 프레임을 변경하면 첫 번째 헤더 뷰가 숨겨 질 수 있습니다 (예 : set x = 0 y = -40). 그러나이 솔루션이 좋은 솔루션이 아니라는 것을 알고 있습니다.
caglar 2013 년

1
수고 해주셔서 감사합니다. 따라서 테이블 뷰가 그룹화 된 스타일을 사용하고 탐색 컨트롤러 내에 포함 된 경우에만 문제가 발생하는 것 같습니다.
Codo

viewcontroller에서 tableviewcontroller로 변경하려고하면 헤더 문제를 해결할 수 없습니다. 변환하려는 것이 누락되었을 수 있습니다. (iOS 7.0.3 sim)
Evgeni Petrov 2014 년

1
이 문제는이 스냅 샷에도 나타납니다! 0 번째 셀은 x : 0.0f & y : 0.0f에서 시작하지 않습니다.
Burhanuddin Sunelwala 2014

6

Swift3 : heightForHeaderInSection은 0에서 작동합니다. 헤더가 clipsToBounds로 설정되어 있는지 확인하기 만하면됩니다.

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

clipsToBounds를 설정하지 않으면 스크롤 할 때 숨겨진 헤더가 표시됩니다.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }

    header.clipsToBounds = true
}

1
clipsToBound = true는 섹션 헤더보기를 완전히 숨기려는 경우 매우 중요합니다. 높이를 0 / CGFLOAT_MIN으로 설정하는 것만으로는 충분하지 않습니다.
Altimac

5

업데이트 [9/19/17] : iOS 11에서 이전 답변이 더 이상 작동하지 않습니다. 감사합니다. Apple. 다음은 수행했습니다.

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 20.0f;
self.tableView.contentInset = UIEdgeInsetsMake(-18.0, 0.0f, 0.0f, 0.0);

이전 답변 :

Chris Ostomo 의 의견에 게시 된대로 다음이 저에게 효과적 이었습니다.

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return CGFLOAT_MIN; // to get rid of empty section header
}

테이블 뷰의 내용이 더 이상 픽셀에 정렬되지 않아서 흐려지고 성능이 저하되는 것 같습니다. 시뮬레이터는이를 드러 낼 수 있습니다 : 문제가있는 정렬을 강조하는 옵션이 있습니다. 그러나 0으로 반올림하면 실제로 좋은 솔루션입니다.
Codo

아니요, 콘텐츠 문제를 발견하지 못했습니다. 제약은 괜찮아 보였습니다.
Manindra Moharana

1
웰프! 더 이상 iOS 11에서 작동하지 않습니다! 내 수정 적은 일주일 이상 지속 .. 😞
Manindra Moharana에게

4

Swift에서 그룹화 된 UITableView에서 상단 섹션 헤더를 제거하는 방법은 다음과 같습니다.

tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))

3

Swift 4.2 및 많은 이전 버전에서는 다른 답변에서와 같이 첫 번째 헤더의 높이를 0으로 설정하는 대신 다른 헤더를 nil. 두 개의 섹션이 있고 두 번째 섹션 (예 :)에만 1헤더가 있어야 한다고 가정합니다 . 해당 헤더에는 Foobar 텍스트가 있습니다 .

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return section == 1 ? "Foobar" : nil
}

3

모든 섹션 헤더를 완전히 제거하려면 이것을 시도하십시오.

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

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

그것은 내가 필요합니다. 간단하고 쉬운 솔루션입니다. 1+
iGhost

0

난 아직 언급하지만 당신이있는 경우에 것을 추가 할 거라고 생각 할 수 UISearchController와 컨트롤러를 UISearchBartableHeaderView, 0으로 첫 번째 섹션의 높이를 설정하는 것은에서 heightForHeaderInSection실제로 작업을 수행합니다.

self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);검색 창이 기본적으로 숨겨 지도록 사용 합니다.

결과는 첫 번째 섹션에 대한 헤더가 없으며 아래로 스크롤하면 첫 번째 행 바로 위에 검색 표시 줄이 표시됩니다.


0

지금까지 가장 쉬운 반환하는 것입니다 nil, 또는 ""에서 func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?당신이 머리글을 표시하지 않으 섹션합니다.


0

Swift 버전 : Swift 5.1
대부분 다음과 같이 tableView 델리게이트에서 높이를 설정할 수 있습니다.

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
   return UIView(frame: CGRect(x: 0, y: 0, width: view.width, height: CGFloat.leastNormalMagnitude))
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
   return CGFloat.leastNormalMagnitude
}

때때로 Xib 또는 Storyboard로 UITableView를 만들 때 up의 대답이 작동하지 않습니다. 두 번째 솔루션을 시도 할 수 있습니다.

let headerView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
self.tableView.tableHeaderView = headerView

그것이 당신을 위해 작동하기를 바랍니다!

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