iOS7에서 스타일이 UITableViewStyleGrouped인 내 UITableView 상단에 추가 패딩이 있는 이유는 무엇입니까?
부터는 iOS7 상단에 .UITableView
이 '는UITableViewStyleGrouped
.
다음은 예입니다.
표 보기는 첫 번째 화살표에서 시작되며 설명되지 않은 패딩의 35픽셀이 있고 녹색 헤더는UIView
된환반이 했습니다.viewForHeaderInSection
(여기서 섹션은 0).
이 35픽셀의 양이 어디서 나오고 어떻게 하면 전환하지 않고 제거할 수 있는지 설명할 수 있는 사람이 있습니까?UITableViewStylePlain
?
업데이트(답변):
iOS 11 이상 버전:
tableView.contentInsetAdjustmentBehavior = .never
저는 다음과 같은 도움을 받았습니다.
YouStoryboard.storyboard > YouViewController > Attributes Inspector > 선택 해제 - 스크롤 뷰를 세트로 조정합니다.
조금 더 가지고 놀았는데 이게 테이블 세팅의 부작용인 것 같습니다.뷰tableHeaderView = nil
.
에는 동적으로 "tableView"가 입니다.tableHeaderView
내가 숨겨야 할 때tableHeaderView
하는대에를 하는 self.tableView.tableHeaderView = nil;
사용자:
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];
는 이 임의적으로 설정하는 것보다 더 .contentInset.top
저는 때문에기하용사제가를 사용하기 때문입니다.contentInset.top
역동적으로 또한.해야 하는 것 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠcontentInset.top
지루합니다.
변경해 보십시오.contentInset
의 UITableView
는 에상됨속서의 상속을 받습니다.UIScrollView
.
self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
해결책이지만 효과적입니다.
IOS 7의 경우 뷰 컨트롤러에서 테이블 뷰를 할당하는 경우 확인할 수 있습니다.
self.edgesForExtendedLayout = UIRectEdgeNone;
당신의 문제는 나와 비슷해 보였습니다.
업데이트:
iOS 9.x에서 Swift:
self.edgesForExtendedLayout = UIRectEdge.None
스위프트 3:
self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
self.automaticallyAdjustsScrollViewInsets = NO;
시도해보세요, 당신은 그것을 처리할 수 있습니다!
앱이 iOS7 이상을 실행 중인지 감지하고 테이블 뷰 대리인(일반적으로 UIViewController 코드)에 이 두 가지 방법을 추가할 수 있습니다.
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
이것은 우아한 해결책이 아닐 수도 있지만 저에게 효과가 있습니다.
빠른 버전:
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
iOS 15용 솔루션:
if #available(iOS 15.0, *) {
tableView.sectionHeaderTopPadding = 0
}
전체 프로젝트에서 수정하기
if #available(iOS 15.0, *) {
UITableView.appearance().sectionHeaderTopPadding = 0
}
자세한 정보: iOS 15에서 테이블 뷰 헤더 위에 추가 패딩
참고: 이는 다음 경우에만 적용됩니다.UITableView.Style.plain
.
나는 나의 원래 버그의 원인을 찾아 그것을 보여주는 샘플 프로젝트를 만들었습니다.iOS7 버그가 있는 것 같습니다.
iOS7 기준으로 그룹화된 스타일로 UITableView를 만들지만 첫 번째 레이아웃에 대리자가 설정되지 않은 경우 대리자를 설정하고 reloadData를 호출하면 상단에 35px 공간이 영원히 사라지지 않습니다.
버그를 보여주면서 만든 이 프로젝트를 보세요: https://github.com/esilverberg/TableViewDelayedDelegateBug
구체적으로 이 파일: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m
24번 라인이 활성화되면,
[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];
맨 위에 35px 공간이 추가로 있을 것입니다.27번 라인이 활성화되고 24번 라인이 주석 처리되면,
self.tableView.delegate = self;
맨 위에 공간이 없습니다.마치 tableView가 결과를 어딘가에 캐싱하고 있으며 대리자가 설정되고 reloadData가 호출된 후 자체적으로 다시 그려지지 않는 것과 같습니다.
세트 내 스크롤 보기 조정을 선택 취소합니다.
또 다른 빠른 의견... 6에서도 XCode 6.1의 .UIScrollViews
,UITextViews
그리고.UITableViews
.
이 문제를 해결하는 유일한 방법은 스토리보드로 이동하여 문제 컨트롤을 끌어 더 이상 페이지의 첫 번째 하위 보기가 되지 않도록 하는 것입니다.
(이 방향을 알려주신 오데드에게 감사드립니다...증상을 보여주고 수정하기 위해 스크린샷 몇 개를 추가하기 위해 이 댓글을 게시합니다.)
그룹화된 TableView를 사용하는 동안 이 옵션을 사용하여 뷰에서 테두리 자르기를 방지합니다.
self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Apple의 iOS7 전환 가이드에 따르면 스크롤 뷰의 콘텐츠 세트가 자동으로 조정됩니다.자동 조정스크롤 보기의 기본값삽입은 YES로 설정됩니다.
UITableView가 있는 UIViewController는 이 속성을 아니요로 설정해야 합니다.
self.automaticallyAdjustsScrollViewInsets = NO;
이 정도면 효과가 있을 겁니다.
편집 1:
또한, 누군가는 시도할 수 있습니다.
self.navigationController.navigationBar.translucent = YES;
이렇게 하면 상단의 여분의 패딩도 제거됩니다.
위의 많은 이전 답변들은 너무 진부합니다.만약 애플이 이 예상치 못한 행동을 고치기로 결정한다면, 그들은 미래에 언제든지 깨어질 것입니다.
문제의 근본 원인:
a
UITableView
0.의 높이를 가진 사용하는 것을 않습니다.높이가 0인 헤더를 사용하려는 경우 솔루션으로 이동할 수 있습니다.해도 0.0이 아닌 높이를 하면,
UITableView
처음에는 0.0 높이의 헤더가 할당되는 것을 원하지 않습니다.
솔루션:
그런 다음 표 보기에 헤더 높이를 할당할 때 헤더 높이가 0이 아닌지 확인하는 것이 가장 간단하고 안정적인 방법입니다.
다음과 같은 방법이 가능합니다.
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;
다음과 같은 경우 특정 시점(일반적으로 스크롤 후)에 문제가 발생할 수 있습니다.
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
스토리보드:
선택 취소하기만 하면 됩니다.Adjust Scroll View Insets
옵션
코드:
self.automaticallyAdjustsScrollViewInsets = false
이 코드는 나에게 효과가 있었고, 나에게 가장 좋은 답은.objective-C
업사이드에 있어서 스위프트로 바꿨습니다.
Swift 4.0+의 경우
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: .leastNonzeroMagnitude))
을 냥이써주요세을것그▁this에 .viewDidLoad()
그리고 그것은 매력적으로 작용할 것입니다.
iOS 15+의 경우 위의 것은 작동하지 않으므로 다음을 사용합니다.
if #available(iOS 15.0, *) {
tableView.sectionHeaderTopPadding = 0
}
iOS 15+의 경우 전체 프로젝트에 변경 사항을 적용하려면 다음을 사용하십시오.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 15.0, *) {
UITableView.appearance().sectionHeaderTopPadding = 0.0
}
}
다음은 Swift 3을 사용하는 iOS 10용 솔루션입니다.
다음 방법을 사용하여 상단 및 하단 패딩을 제거할 수 있습니다.UITableViewDelegate
.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
그래서 저는 여기서 모든 방법을 시도했지만, 이번에는 아무도 도움이 되지 않았습니다.제 경우는 iOS 9의 그룹화된 테이블 뷰였습니다. 제가 왜 그리고 어떻게 이것을 알게 되었는지는 잘 모르겠지만, 저에게는,tableViewHeader
UIView
어도는 .0.01
운동한 높이. CGRectZero
도움이 안 됐어요, 아무것도 도움이 안 됐어요.
tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
VC의 보기 DidLoad에 다음을 추가하기만 하면 됩니다.
self.automaticallyAdjustsScrollViewInsets = NO;
나의 경우 이것이 나를 도와준 것입니다.저도 ios6를 지원합니다.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
}
스토리보드를 통해 iOS 11 및 Xcode 9.1에서 쉽게 수정할 수 있는 방법은 다음과 같습니다.
Table View > Size Inspector > ContentInsets 선택:절대.
스위프트: iOS 스크롤 뷰에 테이블 뷰가 있었습니다.같은 화면에서 "뒤로"를 클릭했을 때.스크롤 보기는 맨 위에 더 많은 공간을 차지합니다.이 문제를 해결하기 위해 사용했습니다.
self.automaticallyAdjustsScrollViewInsets = false
뷰 컨트롤러가 스크롤 뷰 세트를 자동으로 조정할지 여부를 나타내는 부울 값입니다.기본값은 true이며, 이를 통해 상태 표시줄, 탐색 모음 및 도구 모음 또는 탭 모음에서 사용하는 화면 영역에 따라 보기 컨트롤러가 스크롤 뷰 세트를 조정할 수 있습니다.보기 계층에 스크롤 보기가 두 개 이상 있는 경우와 같이 스크롤 보기 세트 조정을 직접 관리하려면 false로 설정합니다.
구체적으로 테이블 뷰를 제거하려면top i의 헤더 공간은 다음과 같이 변경되었습니다.
YouStoryboard.storyboard > YouViewController > TableView > Size Inspector > Content insets - never로 설정합니다.
@Aurelien Porte의 답변 덕분입니다.이것이 나의 해결책입니다.
이 문제의 원인:-
- UITableView는 높이가 0.0인 헤더를 사용하지 않습니다.높이가 0인 헤더를 사용하려는 경우 솔루션으로 이동할 수 있습니다.
- 나중에 헤더에 0.0이 아닌 높이를 할당하더라도 UITableView는 처음에는 높이가 0.0인 헤더가 할당되는 것을 좋아하지 않습니다.
ViewDidLoad에서:-
self.edgesForExtendedLayout = UIRectEdge.None
self.automaticallyAdjustsScrollViewInsets = false
이런 건 필요 없어요 :-
self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)
인heightForHeaderInSection
대리인:-
if section == 0
{
return 1
}
else
{
return 40; // your other headers height value
}
인viewForHeaderInSection
대리인 :-
if section == 0
{
// Note CGFloat.min for swift
// For Objective-c CGFLOAT_MIN
let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min))
return headerView
}
else
{
// Construct your other headers here
}
내 생각에 그것은 단지 새로운 것의 일부일 뿐입니다.UITableViewStyleGrouped
스타일링그룹화된 모든 테이블 보기에 있으며 해당 공간을 직접 제어할 수 있는 방법은 없는 것 같습니다.
해당 공간이 다음으로 표시되는 경우UIView
모든 것을 검색하는 것이 가능할 것입니다.subviews
의 시대의UITableView
특정 보기를 찾아 직접 편집할 수 있습니다.그러나 머리글과 셀이 시작되기 전에 공간이 하드코딩된 오프셋일 뿐이며 편집할 방법이 없을 가능성도 있습니다.
모든 하위 뷰를 검색하려면(출력을 읽기 쉽게 하기 위해 테이블에 셀이 없을 때 이 코드를 실행합니다):
- (void)listSubviewsOfView:(UIView *)view {
// Get the subviews of the view
NSArray *subviews = [view subviews];
// Return if there are no subviews
if ([subviews count] == 0) return;
for (UIView *subview in subviews) {
NSLog(@"%@", subview);
// List the subviews of subview
[self listSubviewsOfView:subview];
}
}
제 대답은 좀 더 일반적인 대답이 되겠지만, 이것에도 적용될 수 있습니다.
루트 뷰(ViewController의 루트 뷰) 또는 루트 뷰의 첫 번째 자식(서브뷰)이 UIScrollView(또는 UIScrollView 자체)의 하위 클래스인 경우와
self.navigationController.navigationBar.translucent = YES;
프레임워크는 자동으로 사전 검증된 콘텐츠를 설정합니다.삽입.
이를 방지하려면 다음을 수행합니다.
self.automaticallyAdjustsScrollViewInsets = NO;
하지만 제 경우에는 다른 개발자들이 사용할 수 있는 UIView 구성요소가 있는 SDK를 구현하고 있었기 때문에 이 작업을 수행할 수 없었습니다.해당 UIView 구성 요소에는 UIWebView(UIScrollView를 첫 번째 하위 뷰로 사용)가 포함되어 있습니다.해당 구성 요소가 UIViewController의 보기 계층에서 첫 번째 자식으로 추가되면 시스템에서 자동 삽입이 적용됩니다.
UI WebView를 추가하기 전에 프레임(0,0,0)이 있는 더미 뷰를 추가하여 수정하였습니다.
이 경우 시스템은 UIScrollView의 하위 클래스를 첫 번째 하위 뷰로 찾지 못했으며 세트에 적용되지 않았습니다.
제게 유일하게 효과가 있었던 것은:
스위프트:
tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0
목표-C:
self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;
또한, 저는 아직 첫 번째 섹션을 위한 여분의 공간이 있었습니다.그것은 내가 그것을 사용했기 때문입니다.tableHeaderView
재산을 잘못 소유했습니다.다음을 추가하여 이 문제도 해결했습니다.
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
Swift 4 코드:섹션 헤더가 없는 테이블 뷰의 경우 다음 코드를 추가할 수 있습니다.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
그러면 헤더 간격이 0이 됩니다.
특정 높이의 헤더가 이 값을 통과하도록 하려면 다음을 수행합니다.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return header_height
}
및 섹션 대리인의 머리글에 대한 뷰를 볼 수 있습니다.
2022년 답변:
당신은 그냥 이것을 합니다.
tableView.contentInsetAdjustmentBehavior = .never
문서화되어 있지 않은.
기괴하고 미묘한 고치야 ->
테이블 보기는 요즘 매우 이상한 동작을 합니다.
노치(XR 등)가 있는 장치에서는 테이블이 화면의 실제 상단에서 시작하는 경우에만 추가 삽입을 지시하지 않고 추가합니다.
화면 맨 위에서 시작하지 않으면 그렇지 않습니다.
모두 관련이 없는 두경모 >>입니다.
safeAreaInsets
은 매우 혼란스러운 것입니다.
그 모든 것은 완전히 문서화되지 않았습니다...당신은 이것을 알아내는데 시간을 낭비할 수 있습니다.
실제로 화면/표의 맨 위에서 측정을 시작해야 하는 경우
사실 간단히 말해 보십시오.
tableView.contentInsetAdjustmentBehavior = .never
좋은 예는 요즘 흔히 볼 수 있는 테이블 위에 배너 또는 유사한 것을 추가하고 테이블 상단을 실행 중인 배너/등의 높이로 설정하는 경우입니다.
그러기 위해서는 다음을 사용해야 합니다.
tableView.contentInsetAdjustmentBehavior = .never
호출 :/
보너스 고치야
요즘에는 거의 항상 일부 정보(사용자 사진, 설명 등)를 동적으로 로드하므로 정보가 도착할 때까지 이러한 값을 최종 필요한 값으로 설정할 수 없습니다.또 다른 고치야.:/
코드는 다음과 같습니다.
func setTableOffsetOnceFlagAreaSizeIsKnown() {
tableView.contentInset.top = yourSpecialFlagViewUpTop.bounds.height
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
setTableOffsetOnceFlagAreaSizeIsKnown()
}
저도 아리에즈와 같은 고정관념을 가지고 있었습니다.UITableView를 상위 보기의 첫 번째 하위 보기가 아닌 것으로 이동하면 해당 보기가 사라집니다.내 공간은 35가 아니라 20px였습니다.
저는 그것을 초상화 xib로 재현할 수 없었고, 단지 풍경 xib일 뿐이었습니다.간단한 데모 앱으로 재현할 수 있다면 나중에 레이더 버그를 접수하겠습니다.
UIEdgeInsets -35000을 만드는 것은 지루하다고 생각합니다.저의 경우 tableView: heightForHeaderInSection: 메서드를 구현했으며 0을 반환할 가능성이 있습니다.
제가 0을 0.1f로 변경했을 때 문제가 사라졌습니다.
언급URL : https://stackoverflow.com/questions/18880341/why-is-there-extra-padding-at-the-top-of-my-uitableview-with-style-uitableviewst
'source' 카테고리의 다른 글
T-sql의 LIKE 명령에 해당하는 zure 테이블 스토리지 쿼리는 무엇입니까? (0) | 2023.05.12 |
---|---|
오르 대 오르세 (0) | 2023.05.12 |
세션 잠금으로 인해 ASP가 발생합니다.웹 사이트 속도 저하 (0) | 2023.05.07 |
Xcode 버전을 여러 개 설치할 수 있습니까? (0) | 2023.05.07 |
키보드에 브레이크 키가 없을 때 VBA 브레이크 실행을 향상시킵니다. (0) | 2023.05.07 |