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

그룹화 된 스타일을 사용하는 테이블보기의 디자인이 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 ) 에 따르면 테이블보기가 탐색 컨트롤러에 포함 된 경우에만 문제가 발생합니다.



답변

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

첫 번째 섹션 헤더의 높이로 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)
}


답변

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
    }
    

답변

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

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

이유:

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


답변

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

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

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


답변

이 방법은 괜찮습니다.

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 {
        ...
    }
}


답변

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

여기에 이미지 설명 입력


답변

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
}