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;
}
}
보일라! :디
이 문제를 해킹되지 않은 방식으로 해결하기 위해 수행해야 할 몇 가지 사항이 있습니다.
- 테이블 뷰 스타일을
UITableViewStyleGrouped
- 테이블 뷰
backgroundColor
를[UIColor clearColor]
backgroundView
각 테이블 뷰 셀을 빈 뷰로 설정하십시오 .backgroundColor [UIColor clearColor]
- 필요한 경우 테이블보기를
rowHeight
적절하게 설정 하거나tableView:heightForRowAtIndexPath:
개별 행의 높이가 다른 경우 대체 하십시오.
원래 IB를 사용한 빠른 솔루션 인 Here 게시했습니다 . 프로그래밍 방식으로 간단하게 수행 할 수 있습니다.
IB를 사용하여 이것을 달성하는 가장 쉬운 방법은 다음과 같습니다.
UIView를 TableView로 드래그하여 헤더 뷰로 만듭니다.
- 해당 헤더보기 높이를 100px로 설정하십시오.
- tableview contentInset (top)을 -100으로 설정하십시오.
- 섹션 헤더는 이제 일반 셀처럼 스크롤됩니다.
어떤 사람들은이 솔루션이 첫 번째 헤더를 숨기고 있다고 말했지만 그러한 문제는 발견하지 못했습니다. 그것은 나를 위해 완벽하게 작동했으며 지금까지 내가 본 가장 간단한 해결책이었습니다.
지금까지 설명한 솔루션에 만족하지 않아서 결합하려고했습니다. 결과는 @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)]];
TableView 스타일을 변경하십시오.
self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];
UITableViewStylePlain- A plain table view. Any section headers or footers are displayed as inline separators and float when the table view is scrolled.
UITableViewStyleGrouped- A table view whose sections present distinct groups of rows. The section headers and footers do not float.
Select Grouped Table View style from your tableView's Attribute Inspector in storyboard.
Change your TableView Style:
self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];
As per apple documentation for UITableView:
UITableViewStylePlain- A plain table view. Any section headers or footers are displayed as inline separators and float when the table view is scrolled.
UITableViewStyleGrouped- A table view whose sections present distinct groups of rows. The section headers and footers do not float. Hope this small change will help you ..
Set the headerView of the table with a transparent view with the same height of the header in section view. Also initi the tableview with a y frame at -height.
self.tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, - height, 300, 400)];
UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)] autorelease];
[self.tableView setTableHeaderView:headerView];
I found an alternative solution, use the first cell of each section instead a real header section, this solution don't appears so clean, but works so fine, you can use a defined prototype cell for your headers section, and in the method cellForRowAtIndexPath ask for the indexPath.row==0, if true, use the header section prototype cell, else use your default prototype cell.
Now that the grouped style looks basically the same as the plain style in iOS 7 (in terms of flatness and background), for us the best and easiest (i.e. least hacky) fix was to simply change the table view's style to grouped. Jacking with contentInsets was always a problem when we integrated a scroll-away nav bar at the top. With a grouped table view style, it looks exactly the same (with our cells) and the section headers stay fixed. No scrolling weirdness.
Assign a negative inset to your tableView. If you have 22px high section headers, and you don't want them to be sticky, right after you reloadData add:
self.tableView.contentInset = UIEdgeInsetsMake(-22, 0, 0, 0);
self.tableView.contentSize = CGSizeMake(self.tableView.contentSize.width, self.tableView.contentSize.height+22);
Works like a charm for me. Works for section footers as well, just assign the negative inset on the bottom instead.
I add the table to a Scroll View and that seems to work well.
Check my answer here. This is the easiest way to implement the non-floating section headers without any hacks.
@LocoMike's answer best fitted my tableView, however it broke when using footers as well. So, this is the corrected solution when using headers and footers:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return (self.sections.count + 1) * 3;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section % 3 != 1) {
return 0;
}
section = section / 3;
...
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
if (section % 3 != 0) {
return nil;
}
section = section / 3;
...
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (section % 3 != 0) {
return 0;
}
section = section / 3;
...
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
if (section % 3 != 2) {
return 0;
}
section = section / 3;
...
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
if (section % 3 != 0) {
return nil;
}
section = section / 3;
...
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
if (section % 3 != 2) {
return nil;
}
section = section / 3;
...
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
int section = indexPath.section;
section = section / 3;
...
}
Change your TableView Style:
self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];
As per apple documentation for UITableView:
UITableViewStylePlain- A plain table view. Any section headers or footers are displayed as inline separators and float when the table view is scrolled.
UITableViewStyleGrouped- A table view whose sections present distinct groups of rows. The section headers and footers do not float.
Hope this small change will help you ..
Swift version of @awulf answer, which works great!
func scrollViewDidScroll(scrollView: UIScrollView) {
let sectionHeight: CGFloat = 80
if scrollView.contentOffset.y <= sectionHeight {
scrollView.contentInset = UIEdgeInsetsMake( -scrollView.contentOffset.y, 0, 0, 0)
}else if scrollView.contentOffset.y >= sectionHeight {
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeight, 0, 0, 0)
}
}
I've learned that just setting the tableHeaderView property does it, i.e. :
tableView.tableHeaderView = customView;
and that's it.
'Programing' 카테고리의 다른 글
BAT 파일이 실행 된 후 CMD를 열린 상태로 유지 (0) | 2020.06.15 |
---|---|
Node.js와 함께 밑줄 모듈 사용 (0) | 2020.06.15 |
JPA에서 발행 한 SQL 쿼리를 보는 방법은 무엇입니까? (0) | 2020.06.15 |
SHA1에 Java 문자열 (0) | 2020.06.15 |
렌더링 문제 렌더링 중 예외 발생 : com / android / util / PropertiesMap [duplicate] (0) | 2020.06.15 |