[ios] UITableView 섹션 헤더의 기본 스크롤 동작 변경

두 섹션이있는 UITableView가 있습니다. 간단한 테이블 뷰입니다. viewForHeaderInSection을 사용하여 이러한 헤더에 대한 사용자 정의보기를 작성하고 있습니다. 여태까지는 그런대로 잘됐다.

기본 스크롤 동작은 섹션이 발견 될 때 다음 섹션이 스크롤 될 때까지 섹션 헤더가 탐색 모음 아래에 고정 된 상태로 유지되는 것입니다.

내 질문은 이것입니다 : 섹션 헤더가 맨 위에 고정되어 있지 않고 나머지 섹션 행과 함께 탐색 모음 아래로 스크롤하도록 기본 동작을 변경할 수 있습니까?

나는 분명한 것을 놓치고 있습니까?

감사.



답변

이 문제를 해결하는 방법은 contentOffset다음 contentInset과 같이 UITableViewControllerDelegate(extends UIScrollViewDelegate) 에 따라를 조정하는 것입니다.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
       CGFloat sectionHeaderHeight = 40;
   if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) {
       scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
   } else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
       scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
   }
}

여기서 문제는 맨 위로 스크롤 할 때 약간의 바운스가 느슨해진다는 것입니다.


{참고 : “40”은 섹션 0 헤더의 정확한 높이 여야합니다. 섹션 0 헤더 높이보다 큰 숫자를 사용하면 손가락 느낌이 영향을받는 것을 볼 수 있습니다 ( “1000”과 같이 시도하고 바운스 동작이 상단에서 이상하게 나타납니다). 숫자가 섹션 0 헤더 높이와 일치하면 손가락 느낌이 완벽하거나 거의 완벽 해 보입니다.}


답변

맨 위에 행이없는 섹션을 추가하고 이전 섹션의 바닥 글을 다음에 대한 머리글로 간단히 사용할 수도 있습니다.


답변

이 작업을 수행 한 경우 Plain 스타일의 UITableViews에 끈적 끈적한 머리글이 있고 Grouped 스타일의 UITableViews가 없다는 사실을 이용합니다. 적어도 사용자 정의 테이블 셀을 사용하여 그룹 테이블의 일반 셀 모양을 모방하려고 시도합니다.

나는 실제로 이것을 시도하지 않았으므로 작동하지 않을 수도 있지만 그것이 내가 제안하는 것입니다.


답변

나는 그것이 늦다는 것을 알고 있지만 결정적인 해결책을 찾았습니다!

당신이하고 싶은 것은 10 개의 섹션이 있다면 dataSource가 20을 반환하도록하십시오. 섹션 헤더에는 짝수를 사용하고 섹션 내용에는 홀수를 사용하십시오. 이 같은

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }else {
        return 5;
    }
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        return [NSString stringWithFormat:@"%i", section+1];
    }else {
        return nil;
    }
}

보일라! :디


답변

이 문제를 해킹되지 않은 방식으로 해결하기 위해 수행해야 할 몇 가지 사항이 있습니다.

  1. 테이블 뷰 스타일을 UITableViewStyleGrouped
  2. 테이블 뷰 backgroundColor[UIColor clearColor]
  3. backgroundView각 테이블 뷰 셀을 빈 뷰로 설정하십시오 .backgroundColor [UIColor clearColor]
  4. 필요한 경우 테이블보기를 rowHeight적절하게 설정 하거나 tableView:heightForRowAtIndexPath:개별 행의 높이가 다른 경우 대체 하십시오.

답변

원래 IB를 사용한 빠른 솔루션 인 Here 게시했습니다 . 프로그래밍 방식으로 간단하게 수행 할 수 있습니다.

이것을 달성하는 가장 쉬운 방법은 (IB 사용) :

UIView를 TableView로 드래그하여 헤더 뷰로 만듭니다.

  1. 해당 헤더보기 높이를 100px로 설정하십시오.
  2. tableview contentInset (top)을 -100으로 설정하십시오.
  3. 섹션 헤더는 이제 일반 셀처럼 스크롤됩니다.

어떤 사람들은이 솔루션이 첫 번째 헤더를 숨기고 있다고 말했지만 그러한 문제는 발견하지 못했습니다. 그것은 나를 위해 완벽하게 작동했으며 지금까지 내가 본 가장 간단한 해결책이었습니다.


답변

지금까지 설명한 솔루션에 만족하지 않아서 결합하려고했습니다. 결과는 @awulf 및 @cescofry에서 영감을 얻은 다음 코드입니다. 실제 테이블 뷰 헤더가 없기 때문에 작동합니다. 테이블 뷰 헤더가 이미있는 경우 높이를 조정해야 할 수도 있습니다.

// Set the edge inset
self.tableView.contentInset = UIEdgeInsetsMake(-23.0f, 0, 0, 0);

// Add a transparent UIView with the height of the section header (ARC enabled)
[self.tableView setTableHeaderView:[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 23.0f)]];