iOS7에서 UITableViewStyleGrouped 스타일을 사용하여 UITableView 상단에 추가 패딩이있는 이유는 무엇입니까?


635

iOS7부터 UITableView스타일 상단에 추가 공간 이 있습니다 UITableViewStyleGrouped.

예를 들면 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

tableview는 첫 번째 화살표에서 시작하고 설명 할 수없는 패딩이 35 픽셀이며 녹색 머리글이 UIView반환됩니다 viewForHeaderInSection(여기서 섹션은 0 임).

이 35 픽셀 양의 출처와 전환하지 않고 어떻게 제거 할 수 UITableViewStylePlain있습니까?


노트 :

iOS 11 이상에서 :

tableView.contentInsetAdjustmentBehavior = .never

최신 iOS 7을 사용하고 있습니까? 이러한 불일치 유형 (일부는 아님) 중 일부는 이후 개발자 미리보기에서 치료되었습니다. 나는 알아야한다 : 나는 너무 많은 문제들이 사라졌다.
Dan Rosenstark

여기에 답을 확인 - stackoverflow.com/a/18986158/1463604
Nishant

짧은 대답은이 추가 패딩은 아마도 섹션 헤더가 아닌 테이블 뷰 헤더 때문이며 UITableView높이가 0.0 인 헤더를 할당하는 것을 좋아하지 않는다는 것입니다. 자세한 내용은 stackoverflow.com/a/31223403/1394534 를 확인 하십시오.
Aurelien Porte

30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];참고 : 0.0f그냥 무시 당신이하는 구형의 높이를 사용하는 경우. 따라서 우리는 가능한 가장 가까운 0에 가까운 CGFloat를 사용합니다 (적어도이 방법은 이상적이지 않습니다).
Alejandro Iván

1
@ AlejandroIván 당신의 의견은 방금 내 밤을 만들었습니다. 그룹화 된 프로토 타입이있는 tableView가 있습니다. numberSections = data.count를 사용하고 numberRows = 1을 설정하고 있습니다. 나는 heightForFooterInSection을 설정하여 각각과 빈 공간 사이에 빈 공간을 만들었습니다. 어떤 이유로 빈 tableHeaderView가 나타났습니다.
라이언 알렉산더

답변:


863

나는 다음에 의해 도움을 받았다.

YouStoryboard.storyboard> YouViewController> 속성 관리자> 선택 취소-스크롤보기 삽입 조정.

여기에 이미지 설명을 입력하십시오


42
이것이 edgeInset 값을 변경하는 대신 패딩을 제거하는 올바른 방법이라고 생각합니다.
Hgeg

21
이 방법은 저에게 효과적이지 않습니다. 불투명 한 navBar가 있고 꺼져 있으면 그 아래의 내용이 푸시됩니다.
slycrel

5
custom을 사용할 때는 작동하지 않습니다 collectionview. ( collectionviewcell
테이블 뷰

5
나를 위해 일하지 않았다; 효과가 있었던 것은 Grouped 대신 Plain으로 바꾸는 것입니다.
shim

28
컨테이너보기 내부의 TableViewController 에이 문제가있었습니다. 이 속성은 포함 된 TableViewController가 아니라 컨테이너보기가 포함 된보기 컨트롤러에서 직접 설정해야했습니다. 그런 다음 효과가있었습니다.
Andy Mortimer

325

나는 그것을 조금 더 가지고 놀았고 이것이 tableView 's 설정의 부작용 인 것처럼 보입니다 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. 다시 계산할 때마다 35px를 추가로 제거해야한다는 contentInset.top것은 지루합니다.


4
훌륭한 솔루션! 실제로 코드에서와 같이 기본 테이블보기 헤더보기를 제거하려면 0.01f로 설정해야합니다.
Simone Manganelli

2
BTW, 이것은 Interface Builder에서 하나의 드래그 앤 드롭으로도 가능합니다. 어쨌든 고마워! :)
Rudolf Adamkovič

8
당신은 이것을위한 메달이 필요합니다
Vaibhav Gautam

7
표 뷰 상단의 0.01f 높이 뷰는 아래의 모든 셀이 잘못 정렬되었음을 의미합니다 (첫 번째 셀은 Y 원점이 0.01이고 다음 셀은 cell_height + 0.01 등임). 잘못 정렬됩니다. ( Debug > Color Misaligned Images시뮬레이터를 켜서 직접 확인하십시오.) 그렇게하고 싶지 않습니다.
Simon Whitaker

2
UITableViewHeaderFooterViewUIView 대신 사용 하는 것이 좋습니다 . 그리고 CGFLOAT_MIN와 동일 작동 0.01f하지만 이론적으로 더 나은.
Jaybo

178

IOS 7의 경우 뷰 컨트롤러에 테이블 뷰를 할당하는 경우

self.edgesForExtendedLayout = UIRectEdgeNone;

너의 문제는 내 것과 비슷해 보였다

최신 정보:

iOS 9.x의 스위프트 :

self.edgesForExtendedLayout = UIRectEdge.None

스위프트 3 :

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

3
내 평원에서 일했다 UITableView. 문제 UITableView는 내가 UIViewController내부에 UINavigationController있었기 때문에 테이블 내용이 44 포인트를 떨어 뜨려 초기 내용이에 뒤지지 않았기 때문에 발생합니다 navBar. 그래도 레이아웃에는 필요하지 않았으므로 문제가 발생했습니다. 결국 나는 automaticallyAdjustsScrollViewInsets작동하는 코드를 변경 했습니다.
DBD

이 속성은 UINavigationController와 같은 컨테이너에 포함 된 컨트롤러를 보는 경우에만 적용됩니다. 창의 루트 뷰 컨트롤러는이 속성에 반응하지 않습니다. 이 속성의 기본값은 all입니다. .. 기본값이 0이어야한다고 생각합니까? 이것이 어디에 이점이 있습니까?
Desh_

5
스위프트 3 더 우아한 :edgesForExtendedLayout = []
데이브 배튼

안녕하세요 @yeahdixon 분홍색 화살표를 만들기 위해 어떤 소프트웨어를 사용하십니까? 미리 감사드립니다
iArezki

174

에서 상속되는 contentInset속성을 변경해보십시오 .UITableViewUIScrollView

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

해결 방법이지만 작동합니다.


6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);상단과 하단에 20 개의 추가 픽셀이 있었기 때문에 가장 효과적이었습니다.
Brian

1
이 "브 루트 포스"솔루션은 효과가 있지만 맨 아래 솔루션 (특히 자동 조정 인셋)의 순위가 더 높아야한다고 생각합니다.
eladleb

134
self.automaticallyAdjustsScrollViewInsets = NO;

시도, 당신은 그것을 다룰 수 있습니다!


iOS 7.0에서 tableHeaderView를 숨기는 데 효과적이지만 이전 버전에서는 지원되지 않습니다.
Brian

iOS 7에서 잘 작동합니다.
StackRunner

3
중요 : UITableView가 다른 컨트롤러에 내장 된 컨트롤러에 배치 된 경우 컨테이너보기 컨트롤러에서이 작업을 수행해야합니다. UITableView를 배치 한 컨트롤러가 아닌 내장 최상위 컨트롤러에서이를 수행하십시오 (AutoLayout은 돌봐주세요).
James Stone

이보다 낫다 uncheck Adjust scroll view insets. 때로는 스토리 보드를 사용하여 UI를 구축하지 않기 때문입니다.
JW.ZG

이것은 나를 위해 작동합니다. 내비게이션 바와 테이블 뷰에 뷰를 첨부했는데 iOS 11에서는 발생하지 않았지만 iOS 10에서는 발생합니다. 감사합니다.
dobiho

78

앱이 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
}

1
이것은 나를 위해 일했습니다. UITableView는 여러 가지 이유로 공간을 추가합니다. 특히 OP와 관련하여 그룹화 된 스타일 테이블 뷰에 대해서만 문제점이 발생합니다. 그리고이 솔루션은 문제를 해결했습니다.
RajV

5
0.001 대신 CGFLOAT_MIN을 사용하면 CGFloat의 가장 작은 절대 값을 얻을 수 있습니다.
eiKatte

2
실제 기능은 그 패딩 만 그룹화 스타일의 테이블보기에서이 있으며 머리글 / 바닥 글 지정하면 무시하기 때문에이 정답이다
야쿱 Truhlář

정답으로 표시해야합니다. 재정의 할 대리자 메서드이며 질문에 답변합니다. 모든 핵을 아래에서 읽으면 적어도 이것을 먼저 시도하십시오. 트윗 해보기 :-(CGFloat) tableView : (UITableView *) tableView heightForHeaderInSection : (NSInteger) 섹션 {// return CGFLOAT_MIN; 30.0f를 반환; }
Matthew Ferguson '

좋은! 보너스로, 그룹화 된 섹션 사이에 작은 헤더를 추가하려면 다음을 사용할 수 있습니다.override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders

55

내 원래 버그의 원인을 발견하고이를 보여주는 샘플 프로젝트를 만들었습니다. iOS7 버그가 있다고 생각합니다.

iOS7부터 Grouped 스타일로 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];

맨 위에 35 픽셀의 공간이 추가로 생깁니다. 27 행이 활성화되어 있고 24 행이 주석 처리 된 경우

self.tableView.delegate = self;

상단에 공간이 없습니다. tableView가 결과를 어딘가에 캐시하고 대리자가 설정되고 reloadData가 호출 된 후 자체적으로 다시 그려지지 않는 것과 같습니다.


21
나는 거기에 위임하지만 경우에도 대리인의 것을 추가 할 것입니다 tableView:heightForHeaderInSection:tableView:heightForFooterInSection:반환 0 당신은 또한이 문제가됩니다. 위의 프로토콜 방법을 구현하고 0.01f를 반환하면 해결되었습니다.
John Estropia

1
예!! 나는 3 개의 소위 솔루션을 시도했지만 이것이 하나였습니다! 화려한 감사합니다 : D
Henrik Erlandsson

완전한. 의도 된 동작이 아니라고 생각하기 때문에 누구나 버그를보고했습니다.
Pushparaj

좋은 발견! 이것은 iOS 9 (XIB를 사용하지 않음)에서 여전히 발생하지만 init에서 위임을 설정하면 간격이 고정됩니다 (loadView 또는 viewDIdLoad가 아님). 감사합니다!
John Stricker

1
헤더의 추정
Viktor

49

"스크롤보기 삽입 조정"을 선택 해제하십시오.

여기에 이미지 설명을 입력하십시오


다른 View Controller에이 옵션이 필요했으며 새 VC를 만들 때 변경 사항이 적용되었습니다. 감사합니다!
David

네! 작동, 그냥 ContainerView에서 설정하고 작동합니다!
Felipe FMMobile 16

46

또 다른 빠른 설명 ... XCode 6.1에서도 UIScrollViews, UITextViews및 의 맨 위에 세로 공백이 나타나는 버그가 UITableViews있습니다.

여기에 이미지 설명을 입력하십시오

때때로이 문제를 해결하는 유일한 방법은 스토리 보드로 이동하여 문제 제어를 끌어서 더 이상 페이지 의 첫 번째 하위 뷰 가 아닌 것 입니다.

여기에 이미지 설명을 입력하십시오

( Oded 에게이 방향으로 나를 가리켜 주셔서 감사합니다 ... 증상을 설명하고 수정하기 위해 몇 가지 스크린 샷을 추가하기 위해이 의견을 게시하고 있습니다.)


1
이 버그 (errrr) 문제는 페이지의 첫 번째 하위 컨트롤로 UITextView가있는 경우 iOS 8에서도 발생합니다. 따라서 UITableView 문제가 아닙니다.
Mike Gledhill

1
모든 솔루션 중에서이 해킹 만 나를 위해 일했습니다. 이상한 버그에 대한 이상한 수정. UITableview 에서이 문제에 직면했습니다.
Mesbah

4
100 만 감사합니다! 이것은 나를 위해 일한 유일한 솔루션입니다.
user139816

1
(18 개월이 지난 지금도 독자들은 여전히이 답변에 투표하고 있습니다. 애플은이 문제를 아직 심각하게
고치지

1
내 목숨을 구했다! 감사. 이 간단한 "수정"을 찾는 데 얼마나 걸 렸는지 아십니까? grrh.
Mc.Stever

40

Apple의 iOS7 용 전환 안내서에 따르면 스크롤보기의 내용 삽입이 자동으로 조정됩니다. automaticAdjustsScrollViewInsets 의 기본값 은 YES로 설정되어 있습니다.

UITableView가있는 UIViewController는이 특성을 NO로 설정해야합니다.

self.automaticallyAdjustsScrollViewInsets = NO;

이것은 트릭을 할 것입니다.

편집 1 :

또한 시도 할 수 있습니다-

self.navigationController.navigationBar.translucent = YES;

또한 상단의 추가 패딩이 제거됩니다.


질문에 정확히 대답하지 않으면 아주 좋은 답변입니다. Esilver는 35px 간격에 대해 이야기하지만 iOS7은 상태 표시 줄 높이와 같은 20px 헤더를 추가합니다.
Martin

어리석은 문제. 답변 해주셔서 감사합니다.
Genki

이것은 다른 문제에 대한 해답입니다.
entonio

내 경우에는 뷰 컨트롤러에 테이블 뷰 컨트롤러가 내장되어 있고 뷰 컨트롤러에서 자동으로 AdjustsScrollViewInsets = false를 설정하여 상단 간격이 사라졌습니다
Alexey

39

그룹화 된 TableView를 사용하는 동안 view에서 경계 절단을 피하려면 이것을 사용하십시오.

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);

다른 사람들은 모두 시험해 보았습니다. 이것이 효과가있는 것입니다! Thx
Michael

36

위의 많은 이전 답변이 너무 해킹 적입니다. 애플이이 예기치 않은 행동을 고치기로 결정한다면 그들은 언제라도 깨질 것이다.

문제의 근본 :

  1. a UITableView는 높이가 0.0 인 헤더를 좋아하지 않습니다. 당신이하려는 것은 높이가 0 인 헤더를 갖는 것이라면 솔루션으로 이동할 수 있습니다.

  2. 나중에 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;

마지막으로, 나는 작동하는 답을 찾았습니다. 감사. 또한 tableView.tableHeaderView실제로 행 내용 위의 액세서리보기 라는 것을 배웠습니다 . 귀하의 답변이 나올 때까지 섹션 헤더와 혼동되었습니다.
Joe Huang

1
CGFLOAT_MINCGFloat.leastNormalMagnitudeSwift 3
Clay Ellis

29

스토리 보드 :

Adjust Scroll View InsetsView Controller 옵션에서 선택 해제하십시오.

여기에 이미지 설명을 입력하십시오

암호:

self.automaticallyAdjustsScrollViewInsets = false

2
xcode 7을 사용하는 경우 속성 관리자> 레이아웃이 보이지 않습니다. self.automaticallyAdjustsScrollViewInsets = false를 추가해야합니다.
alex

보기에로드되었습니다.
CW0007007

23

이것은 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
}

SO의 두 번째 페이지가 도움이되었습니다 .... 왜 AutomaticDimension 때문인지, VFL 제약 조건 때문인지 모르겠습니다. 감사합니다! ozi bua ist brav! : D
Pentarex

이들은 섹션 머리글과 바닥 글입니다. 질문은 전체 테이블 헤더와 관련이 있습니다. 또한 델리게이트 방법 중 하나 (Swift3 또는 iOS 10에만 해당되는 것은 없습니다).
Nicolas Miari

14

제 경우에는 이것이 도움이되었습니다. 나는 ios6도 지원하고 있습니다.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}

이것이 무엇인지 확실하지 않지만 완벽하게 작동했습니다. 설명 좀 해 주시겠습니까?
매트 울프

@MattWolfe 나는 길을 잃었고이 해결책을 찾았습니다. 왜 이런 일이 일어나고 있는지 확실하지 않습니다. 내 생각에 컨트롤러는 상태 표시 줄 (또는 다른 경우 도구 모음 / 탭 표시 줄)으로 인해 테이블 ​​뷰에 삽입이 필요하다고 결정하므로 자동으로 추가합니다. 나는 새로운 iOS7 "특징들"과 관련하여 정말 어려움을 겪고있다. 어쩌면 누군가가 그것을 이해하고 이것에 대한 실제 설명이 있습니까?
루카스

지난 2 일 동안 상대적으로 작은 앱을 iOS 7로 포팅하고 여전히 작은 문제가 발생했습니다. iOS 7에서 수정하여 6에서, 그 반대의 경우도 마찬가지입니다.
매트 울프

이것은 OP와 다른 문제입니다. 이 경우에도 그룹화 된 테이블보기의 경우 추가 공간이 맨 위에 추가됩니다.
RajV

1
이것이 핵심 라인 인 것 같습니다 : self.automaticallyAdjustsScrollViewInsets = NO; 내가 가진 여분의 공간을 제거하는 설정.
Mike M

14

VC의 viewDidLoad에 다음을 추가하기 만하면됩니다.

self.automaticallyAdjustsScrollViewInsets = NO;

이 수정 프로그램은 효과가 있었고 마법 번호를 사용하여 삽입물을 수동으로 설정하는 것을 선호합니다. 감사!
imobilizer

14

그래서 나는 여기서 모든 방법을 시도했지만 이번에는 아무도 도움이되지 않았습니다. 필자의 사례는 iOS 9에서 그룹화 된 테이블보기였습니다.이 이유와 방법을 실제로 알지 못했지만 적어도 키로 설정하면 문제 tableViewHeader가 해결되었습니다. 도움이되지 않았습니다. 아무 도움이되지 않았습니다.UIView0.01CGRectZero

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))

10

스위프트 : iOS 스크롤보기에서 테이블 뷰를 보았습니다. 같은 화면에서 "뒤로"를 클릭했을 때. 스크롤보기는 더 많은 공간을 차지합니다.이 문제를 해결하기 위해 사용했습니다 :

 self.automaticallyAdjustsScrollViewInsets = false

뷰 컨트롤러가 스크롤 뷰 삽입을 자동으로 조정해야하는지 여부를 나타내는 부울 값입니다. 기본값은 true이며, 상태 표시 줄, 탐색 표시 줄 및 도구 모음 또는 탭 표시 줄에서 사용하는 화면 영역에 따라보기 컨트롤러가 스크롤보기 삽입을 조정할 수 있습니다. 보기 계층 구조에 둘 이상의 스크롤보기가있는 경우와 같이 스크롤보기 삽입 조정을 직접 관리하려면 false로 설정하십시오.


10

@Aurelien Porte의 답변에 감사드립니다. 여기 내 해결책이 있습니다

이 문제의 원인 :-

  1. UITableView는 높이가 0.0 인 헤더를 좋아하지 않습니다. 당신이하려는 것은 높이가 0 인 헤더를 갖는 것이라면 솔루션으로 이동할 수 있습니다.
  2. 나중에 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 
}

10

Storyboard를 통해 iOS 11Xcode 9.1 에서 쉽게 수정하는 방법은 다음 과 같습니다.

표보기> 크기 검사기> 내용 삽입물 : 안 함을 선택하십시오.


1
나를 위해 일했다 :)
bhupinder

큰! 감사합니다 :)
Saeed Ir

1
이것은 automaticallyAdjustsScrollViewInsetsios 11 대신
Nik Kov

9

나는 그것이 새로운 UITableViewStyleGrouped스타일의 일부라고 가정합니다 . 모든 그룹화 된 테이블 뷰에 있으며 해당 공간을 제어하는 ​​직접적인 방법이없는 것 같습니다.

그 공간이로 표현되는 경우 UIView, 모든 통해 검색 할 수있을 것이다 subviewsUITableView특정 뷰와 직접 편집을 찾을 수 있습니다. 그러나 공간은 헤더와 셀이 시작되기 전에 하드 코딩 된 오프셋 일 가능성이 있으며 편집 할 수있는 방법이 없습니다.

모든 하위 뷰를 검색하려면 (테이블에 셀이 없을 때이 코드를 실행하여 출력을 좀 더 읽기 쉽도록)합니다.

- (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];
    }
}

3
UITableViewCellScrollViewiOS7의 UITableViews (보다 구체적 )가 우리에게 한 가지를 가르쳐 주면 내장 클래스의 뷰 계층 구조 만 남겨 두어야합니다.
Matthias Bauch

좋은 지적. 다른 옵션은 각 iOS 용 해킹 유지 ...입니다)
댄 Rosenstark는

그렇습니다. 그 경고를 쓰려고했지만 잊어 버렸습니다.
케빈

케빈-당신이 옳다고 생각합니다. 이것은 의도적입니다. heightForHeaderInSection에 대해 0을 반환하는 것이이 패딩을 제거하는 가장 쉬운 방법 인 것 같습니다. 특정 인스턴스에서 어떤 이유로 든 작동하지 않지만 다른 UITableView에서 작동합니다.
esilver

1
확실히 "디자인에 의한 것"입니다. 실행을 일시 중지하고 실행 한 경우 : po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]표 머리글 또는 첫 번째 섹션 머리글 또는 첫 번째 셀 (사용하는 내용에 따라 다름)에 자연스럽게 35px 테두리가 남는 것을 볼 수 있습니다.
Mr. T

9

내 대답은보다 일반적인 대답이 될 것이지만 이것에도 적용될 수 있습니다.

는 IF 루트보기 (의 의 ViewController ) 또는 첫 번째 자식 (하위 뷰) 루트 뷰가있는 UIScrollView (또는있는 UIScrollView 자체), 그리고 만약의 서브 클래스

self.navigationController.navigationBar.translucent = YES;

프레임 워크는 미리 계산 된 contentInset을 자동으로 설정 합니다.


이를 피하기 위해 할 수있는 일

self.automaticallyAdjustsScrollViewInsets = NO;

그러나 내 경우에는 다른 개발자가 사용할 수있는 UIView 구성 요소가있는 SDK를 구현했기 때문에이 작업을 수행 할 수 없었습니다. 해당 UIView 구성 요소에는 UIWebView (UIScrollView가 첫 번째 서브 뷰로 있음)가 포함되어 있습니다. 해당 구성 요소가 UIViewController의 뷰 계층에서 첫 번째 자식으로 추가되면 시스템에 의해 자동 삽입이 적용됩니다.

UIWebView를 추가하기 전에 프레임 (0,0,0,0)으로 더미보기를 추가 하여이 문제를 해결했습니다 .

이 경우 시스템은 UIScrollView의 서브 클래스를 첫 번째 서브 뷰로 찾지 않고 삽입을 적용하지 않았습니다.


생명의 은인! 감사합니다self.automaticallyAdjustsScrollViewInsets = false
ethanneff

8

이 코드는 나를 위해 일했습니다 objective-C. 위쪽 으로 작성된 최고의 답변 으로 Swift로 변환했습니다.

스위프트 4.0 이상

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

이것에 쓰면 viewDidLoad()매력처럼 작동합니다.


1
대단히 감사합니다.
Ângelo Polotto

1
환영하는 행복한 코딩
Vipul Kumar

7

나는 arielyz와 같은 수정을 가졌습니다. UITableView를 상위 뷰의 첫 번째 하위 뷰가 아닌 것으로 옮기면 사라졌습니다. 내 공간은 35 픽셀이 아닌 20 픽셀이었습니다.

세로 xib에서 가로 xib로 다시 만들 수 없었습니다. 간단한 데모 앱에서 레이더 버그를 재현 할 수 있다면 나중에 레이더 버그를 제출할 것입니다.


같은 문제가 발생하여 contentInset을 변경하여 해결할 수 없었지만이 방법은 꽤 해킹되었지만 작동했습니다. 시각적 디버깅 도구를 사용하여 가치가있는 것은 UITableView의 높이가 적당하지만 UITableViewWrapper의 높이는 그렇지 않은 것을 알 수있었습니다.
Mic Fok

완전한. 이것은 XCode 6.1에서 버그를 수정했습니다. 이 StackOverflow 페이지의 다른 제안은 아무런 차이가 없습니다. UIView 내에 UITableView가 있었고 첫 번째 하위보기가있었습니다. 그것을 2 차 하위 뷰가되도록 드래그하면 완벽하게 고정되었습니다. (누구든지 나를 필요로하면 술집에있을 것이다.)
Mike Gledhill

감사합니다! 컨테이너 내에 테이블 뷰 컨트롤러가있는 경우에도 작동합니다. 상위 뷰에서 첫 번째가 아닌 컨테이너를 이동하면 테이블 뷰 상단의 간격이 제거됩니다.
strangeluck

7

나는 UIEdgeInsets -35 0 0 0을 만드는 것이 지루하다고 생각합니다. 필자의 경우 tableView : heightForHeaderInSection : 메서드를 구현했으며 0을 반환 할 가능성이 있습니다.

0에서 0.1f로 변경하면 문제가 해결되었습니다.


1
내가 할 수 있다면, 나는 이것을 두 번 이상 공표 할 것이다. 이상한 자동 레이아웃 글리치 또는 무언가 여야합니다.> 0 이상으로 작동하는 것처럼 0.1 대신 FLT_EPSILON 또는 DBL_EPSILON을 사용하는 것이 좋습니다. 둘 다 1.0 + epsilon! = 1.0과 같은 smalles 양수 값을 나타내는 것으로 간주합니다. = 1.0
Henri Normak

7

나를 위해 일한 유일한 것은 :

스위프트 :

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.2에서 작동합니다. 감사합니다
Sylar

헤더 뷰가있는 iOS13 그룹화 된 테이블 뷰의 경우이 페이지의 모든 것을 시도했습니다. self.tableView.tableHeaderView = UIView (frame : CGRect (x : 0, y : 0, width : tableView.frame.size.width, height : 0.01)). 문제를 해결했습니다.

7

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
}

viewForHeaderinSection 대리자의 뷰.


이것은 질문에 대답하지 않습니다. 문제는 여분의 간격이 어디에서 나오는지에 대한 문제였습니다.
Stephen Newell

이상한 것은 만약 당신이 만약 당신이 heightForHeaderInsection u에서 0을 리턴한다면 u는 여전히이 여분의 공간을 얻는다는 것입니다. 그것은 CGFloat.leastNormalMagnitude (최소 양수)와 완벽하게 작동합니다
ShadeToD

7

구체적으로, tableviewHeader 공간을 맨 위에서 제거하기 위해 다음과 같이 변경했습니다.

YouStoryboard.storyboard> YouViewController> TableView 선택> 크기 관리자> 컨텐츠 삽입-절대로 설정하지 마십시오.

여기에 이미지 설명을 입력하십시오


이 답변 과 비교하여 스크린 샷 이외의 추가 정보는 무엇입니까 ?
Artjom B.

그것은 내가 생각하는 것과 동일합니다. 나는 해결책을 찾을 때 그 대답을 찾지 못했습니다. 대답을 삭제해야합니까?.?
user832

콘텐츠 삽입 =이 문제를 실제로 해결하지 않는 이유 (이 옵션은 어떻게 작동합니까?)를 설명하여 답변을 조금 더 확장 할 수 있다면 아닙니다.
Artjom B.

내용 삽입이 절대로 설정되지 않으면 textField 편집시 tableView가 위로 스크롤되지 않습니다.
mojtaba al moussawi

6

이것을 사용 하여이 도움이 생각합니다 ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }

1
훌륭한! iOS 9.2의 매력처럼 작동합니다. 이 답변은 경우에 따라 첫 번째 헤더를 표시하지 않고 다른 헤더에서는 표시해야하므로 완벽합니다. CGFloat.min을 사용하는 또 다른 대답을 보았습니다. 따라서 내 viewController는 이제 44.0과 같은 실수 나 0을 제공 할 수 있습니다.
David H

6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }

automaticAdjustsScrollViewInsets = 나에게서 잘못된 일! 고마워!
Daniel Kuta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.