UITableViewStylePlain을 사용하여 UITableView에서 부동 헤더를 비활성화할 수 있습니까?
사용 중입니다.UITableView
콘텐츠 '페이지'를 레이아웃합니다.테이블 뷰의 헤더를 사용하여 특정 이미지 등을 레이아웃하고 있으며 스타일이 다음으로 설정되었을 때처럼 부동하지 않고 정적으로 유지되면 좋겠습니다.UITableViewStyleGrouped
.
에는 기사(으)를 합니다.UITableViewStyleGrouped
이것을 할 수 있는 방법이 있습니까?그룹화된 사용은 모든 셀에 여백을 추가하고 각 셀에 대해 배경 보기를 비활성화해야 하므로 사용하지 않도록 설정합니다.레이아웃을 완전히 제어하고 싶습니다.이상적으로는 "UITableViewStyleBones"이지만 문서에서 해당 옵션을 보지 못했습니다.
대단히 고맙습니다,
이를 달성하는 더 쉬운 방법:
목표-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 = UIEdgeInsets(top: -dummyViewHeight, left: 0, bottom: 0, right: 0)
섹션 헤더는 이제 일반 셀과 마찬가지로 스크롤됩니다.
(잘못된 테이블 스타일로 인해 여기에 온 사용자) 특성 검사기 또는 코드를 통해 테이블 스타일을 일반에서 그룹화로 변경합니다.
let tableView = UITableView(frame: .zero, style: .grouped)
경고: 이 솔루션은 예약된 API 메서드를 구현합니다.이로 인해 AppStore에서 배포할 수 있도록 App이 Apple에 의해 승인되지 않을 수 있습니다.
블로그에 떠 있는 섹션 머리글을 돌리는 개인적인 방법에 대해 설명했습니다.
기본적으로, 당신은 단지 하위 분류가 필요합니다.UITableView
그리고 돌아옴NO
으로: 가지방 으로법두:로:
- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;
Interface Builder에서 문제의 테이블 보기를 클릭합니다.
그런 다음 특성 검사기로 이동하고 스타일 일반을 그룹화됨으로 변경합니다;) 쉬운 방법
네, 늦었지만 어쩔 수 없었어요.저는 지금까지 10시간 동안 해결책을 찾았지만 완벽한 답을 찾지 못했습니다.몇 가지 힌트를 찾았지만 시작자들이 이해하기가 어려웠습니다.그래서 저는 2센트를 넣고 답을 완성해야 했습니다.
몇 가지 답변에서 제안했듯이, 제가 구현할 수 있는 유일한 해결책은 표 보기에 일반 셀을 삽입하여 섹션 헤더로 처리하는 것이지만, 이를 달성하는 더 나은 방법은 각 섹션의 0행에 이러한 셀을 삽입하는 것입니다.이렇게 하면 이러한 사용자 지정 부동 헤더를 매우 쉽게 처리할 수 있습니다.
그래서 단계가.
스타일 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; }
평소와 같이 제목 ForHeaderInSection을 구현합니다(자신의 논리를 사용하여 이 값을 얻을 수 있지만 표준 대리인을 사용하는 것이 좋습니다).
- (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section { NSString *headerTitle = [sectionArray objectAtIndex:section]; return headerTitle; }
테이블 뷰에서 섹션 수를 정상적으로 구현
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { int sectionCount = [sectionArray count]; return sectionCount; }
평소와 같이 섹션의 행 수를 구현합니다.
- (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 }
HeaderInSection에 대해 높이 0.0f를 반환합니다.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 0.0f; }
HeaderInSection에 대한 view를 구현하지 마십시오.0을 반환하는 대신 메소드를 완전히 제거합니다.
행 높이 위치인덱스 경로.(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 } }
이제 셀포로우앳IndexPath, 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; } }
이제 구현 시 SelectRowAtIndexPath 및 indexpath.row == 0인 경우 nil을 반환합니다.SelectRowAt를 실행한 것이 중요합니다.섹션 헤더 행에 대해 IndexPath가 실행되지 않습니다.
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 0) { return nil; } return indexPath; }
그리고 마지막으로 SelectRowAt.IndexPath, 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 } }
이것으로 당신은 끝입니다.이제 완벽하게 스크롤되고 부동하지 않은 섹션 헤더가 있습니다.
사용자 지정 셀을 사용하여 헤더 행을 수행함으로써 이를 위장할 수 있어야 합니다.그러면 표 보기의 다른 셀처럼 스크롤됩니다.
당신은 단지 논리를 추가하면 됩니다.cellForRowAtIndexPath
헤더 행일 때 올바른 셀 유형을 반환합니다.
하지만 섹션을 직접 관리해야 할 수도 있습니다. 즉, 모든 것을 한 섹션에 넣고 헤더를 위장해야 합니다. (헤더 뷰에 대한 숨겨진 뷰를 반환하려고 시도할 수도 있지만, 그것이 효과가 있을지 모르겠습니다.)
테이블 뷰 스타일 변경:
self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];
UITableView에 대한 애플 문서에 따름:
UITableViewStylePlain - 일반 테이블 뷰입니다.횡단 머리글 또는 바닥글은 테이블 뷰를 스크롤할 때 인라인 구분 기호로 표시되고 부동합니다.
UITableViewStyleGrouped - 섹션에 개별 행 그룹이 표시되는 테이블 뷰입니다.섹션 머리글과 바닥글이 뜨지 않습니다.
UITableViewStyleGrouped의 흥미로운 점은 TableView가 아니라 TableView가 셀에 스타일을 추가한다는 것입니다.
스타일은 단면에서 셀의 위치에 따라 다른 배경을 그리는 것을 처리하는 UIGroupTableViewCellBackground라는 클래스로 셀에 backgroundView로 추가됩니다.
따라서 매우 간단한 솔루션은 UITableViewStyleGrouped를 사용하고 테이블의 backgroundColor를 clearColor로 설정한 다음 cellForRow: 셀의 backgroundView를 바꾸는 것입니다.
cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];
또 다른 까다로운 방법이 있습니다.주요 아이디어는 섹션 번호를 두 배로 늘리는 것이며, 첫 번째 아이디어는 헤더 뷰만 표시하고 두 번째 아이디어는 실제 셀을 표시합니다.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (section%2 == 0) {
return 0;
}
return _rowCount;
}
그러면 헤더를 구현해야 합니다.섹션에서 딜러들:
- (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
}
다른 접근 방식과 비교할 때 이 방법은 프레임이나 내용을 변경하지 않으면서도 안전합니다.테이블 뷰의 집합입니다.이것이 도움이 되기를 바랍니다.
스위프트 3+용
간히사를 사용하세요.UITableViewStyleGrouped
다음을 사용하여 바닥글 높이를 0으로 설정합니다.
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return .leastNormalMagnitude
}
비록 이것이 당신의 문제를 해결하지는 못할지도 모르지만, 제가 비슷한 일을 하고 싶을 때 그것은 저에게 도움이 되었습니다.머리글을 설정하는 대신 위 섹션의 바닥글을 사용했습니다.저를 구해준 것은 이 섹션이 작고 정적이어서 뷰의 아래쪽으로 스크롤하지 않았다는 것입니다.
원하는 것을 얻는 가장 쉬운 방법은 테이블 스타일을 다음과 같이 설정하는 것입니다.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
원하는 것을 얻으려면 헤더 높이와 헤더 보기를 설정하는 것을 잊지 마십시오.
아마도 당신은 사용할 수 있습니다.scrollViewDidScroll
표에서 및 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)
}
}
이 문제에 어떻게 접근해야 할지 생각하는 동안, 저는 UITableViewStyleGrouped에 대한 매우 중요한 세부사항을 기억했습니다.UITableView는 그룹화된 스타일(셀 주위의 둥근 테두리)을 구현하는 방법으로 UITableViewCells에 사용자 지정 backgroundView를 추가하는 것이지 UITableView에 사용자 지정 backgroundView를 추가하는 것은 아닙니다.각 셀은 섹션의 위치에 따라 백그라운드 뷰가 추가됩니다(위쪽 행은 섹션 경계의 위쪽 부분을, 가운데 행은 측면 경계를, 아래쪽 셀은 아래쪽 부분을).따라서 일반적인 스타일을 원할 뿐 셀에 대한 사용자 지정 배경 보기가 없는 경우(90%의 경우), UITableViewStyleGrouped를 사용하고 사용자 지정 배경을 제거하기만 하면 됩니다.이 작업은 다음 두 단계를 수행하여 수행할 수 있습니다.
tableView style을 UITableViewStyleGrouped로 변경 셀을 반환하기 직전에 cellForRow에 다음 행을 추가합니다.
cell.backgroundView=cisco[UIView alloc] initWithFrame:cell.bounds] 자동 해제];
그리고 그게 다야.테이블 뷰 스타일은 부동 머리글을 제외하고는 UITableViewStylePlain과 동일하게 됩니다.
이것이 도움이 되길 바랍니다!
부동 섹션 헤더 섹션을 완전히 제거하려면 다음 작업을 수행합니다.
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
return [[UIView alloc] init];
}
return nil
작동하지 않습니다.
부동이지만 횡단 머리글을 표시하지 않으려면 고유한 동작이 있는 사용자 정의 보기를 제공할 수 있습니다.
또 다른 방법은 머리글을 넣을 섹션 바로 앞에 빈 섹션을 만들고 해당 섹션에 머리글을 넣는 것입니다.섹션이 비어 있으므로 헤더가 즉시 스크롤됩니다.
위에 섹션 하나(행이 0개)를 추가한 다음 위 섹션을 설정할 수 있습니다.바닥글현재 섹션의 머리글 보기로 보기, 바닥글 보기가 뜨지 않습니다.도움이 되길 바랍니다.
XAK를 무시합니다.앱이 애플에 의해 승인되기를 원하는 경우 개인적인 방법을 탐색하지 마십시오.
인터페이스 작성기를 사용하는 경우 이 방법이 가장 쉽습니다.보기의 맨 위(이미지가 이동할 위치)에 UIV 보기를 추가한 다음 그 아래에 테이블 보기를 추가합니다.IB는 이에 따라 크기를 조정해야 합니다. 즉, 테이블 보기의 상단이 방금 추가한 UI 보기의 하단에 닿고 높이가 화면의 나머지 부분을 덮습니다.
여기서는 해당 UIView가 실제로 테이블 뷰의 일부가 아닌 경우 테이블 뷰 헤더를 무시하고 테이블 뷰로 스크롤하지 않습니다.
인터페이스 빌더를 사용하지 않을 경우 테이블 뷰의 위치와 높이를 정확하게 지정해야 하기 때문에 조금 더 복잡합니다.
StoryBoard: StoryBoard의 표 머리글 보기를 사용하여 머리글을 구현하는 방법에 대한 답변 확인
또한 구현하지 않을 경우
viewForHeaderInSection:(NSInteger)section
당신이 정확히 원하는 것은 뜨지 않을 것입니다.
@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
}
}
}
스니펫은 첫 번째 섹션에 대해서만 고정 헤더를 표시합니다.다른 섹션 헤더는 셀과 함께 이동합니다.
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)
}
}
헤더에 빈 섹션을 추가하는 것이 까다로운 방법입니다.단면에 셀이 없기 때문에 부동하지 않습니다.
**Swift 5.3 | 프로그래밍 방식 **
private func buildTableView() -> UITableView {
let tableView = UITableView()
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.rowHeight = UITableView.automaticDimension
tableView.showsVerticalScrollIndicator = false
tableView.separatorStyle = .none
let dummyViewHeight: CGFloat = 80
tableView.tableFooterView = UIView(
frame: CGRect(x: .zero,
y: .zero,
width: tableView.bounds.size.width,
height: dummyViewHeight))
tableView.contentInset = UIEdgeInsets(top: .zero, left: .zero, bottom: -dummyViewHeight, right: .zero)
return tableView
}
아래의 두 가지 시나리오에 가장 적합한 솔루션:
시나리오 1: tableView 스타일이 .grouped가 아닌 경우.그룹화로 변경하는 데 문제가 없습니다.바닥글이 뜨지 않습니다.
시나리오 2: 테이블 끝에 바닥글을 하나만 표시하려면 보기를 선택합니다.그리고 스타일은 .plain 입니다.
단계:
- 마지막에 섹션을 하나 더 추가합니다.
- 추가된 섹션에서 (numberOfRowsInSection 메서드) 행 수가 0인지 확인합니다.
- 해당 섹션에 사용자 지정 바닥글을 추가합니다.
- FooterInSection의 높이를 사용자 정의 바닥글로 설정하고 다른 섹션의 바닥글로 0을 설정합니다.
예:
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
//참고: 사용자 정의 섹션을 추가할 섹션을 필터링
let footerView = UIView()
submitOrganiser?.showFooterAtTheEnd(view: footerView) //my method to customise the footer, use your implementation
return footerView
}
만약 당신이 사용하는 것이 괜찮다면.UICollectionView
또한 iOS 13.0+의 UICollectView 목록 구성을 사용하고 다음을 사용할 수 있습니다.headerMode
로 설정한..firstItemInSection
.
override func viewDidLoad() {
super.viewDidLoad()
var config = UICollectionLayoutListConfiguration.init(appearance: .plain)
config.headerMode = .firstItemInSection
let listLayout = UICollectionViewCompositionalLayout.list(using: config)
self.collectionView.collectionViewLayout = listLayout
}
이 작업은 위임자의 뷰ForHeaderInSection 및 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];
}
그러면 사용자가 스크롤할 때 헤더 보기가 사라집니다.이게 왜 이런 식으로 작동하는지는 모르겠지만, 여러분이 원하는 것을 성취하는 것 같습니다.
머리글 보기 배경을 투명하게 만들 수 있습니다.
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
view.tintColor = [UIColor clearColor];
}
또는 전체적으로 적용할 수:
[UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];
자동 레이아웃 없이 XIB를 통해 모든 작업을 수행할 수 있는 더 간단한 솔루션이 있습니다.
1/ 표 보기에 직접 끌어다 놓아 표 보기에 헤더를 놓습니다.
2/ 새로 만든 헤더의 Size Inspector에서 자동 크기 변경: 상단, 왼쪽, 오른쪽 앵커와 채우기를 수평으로 유지해야 합니다.
그 정도면 효과가 있을 겁니다!
@samvermette의 대답에 따르면 »나는 위의 코드를 스위프트에서 구현하여 코더들이 스위프트를 쉽게 사용할 수 있도록 하였습니다.
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)
참조: https://stackoverflow.com/a/26306212
let tableView = UITableView(frame: .zero, style: .grouped)
플러스
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 0 {
return 40
}else{
tableView.sectionHeaderHeight = 0
}
return 0
}
이것은 헤더 공간을 사용하는 데 도움이 되었습니다.
언급URL : https://stackoverflow.com/questions/1074006/is-it-possible-to-disable-floating-headers-in-uitableview-with-uitableviewstylep
'IT' 카테고리의 다른 글
각도 - 모든 요청에 대한 헤더 설정 (0) | 2023.05.13 |
---|---|
당신은 append 대신 mongo $push prepend를 가질 수 있습니까? (0) | 2023.05.13 |
ASP에 대한 그리드 컨트롤.NET MVC? (0) | 2023.05.13 |
텍스트 문자열 내에서 텍스트를 추출하는 방법 (0) | 2023.05.13 |
두 개의 목록(Of String)을 결합하는 가장 효율적인 방법은 무엇입니까? (0) | 2023.05.13 |