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

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

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

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

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

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


노트 :

iOS 11 이상에서 :

tableView.contentInsetAdjustmentBehavior = .never



답변

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

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

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


답변

나는 그것을 조금 더 가지고 놀았고 이것이 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것은 지루합니다.


답변

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

self.edgesForExtendedLayout = UIRectEdgeNone;

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

최신 정보:

iOS 9.x의 스위프트 :

self.edgesForExtendedLayout = UIRectEdge.None

스위프트 3 :

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


답변

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

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 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
}


답변

내 원래 버그의 원인을 발견하고이를 보여주는 샘플 프로젝트를 만들었습니다. 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가 호출 된 후 자체적으로 다시 그려지지 않는 것과 같습니다.