source

iOS7에서 스타일이 UITableViewStyleGrouped인 내 UITableView 상단에 추가 패딩이 있는 이유는 무엇입니까?

lovecheck 2023. 5. 12. 22:21
반응형

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지루합니다.

변경해 보십시오.contentInsetUITableView는 에상됨속서의 상속을 받습니다.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;

이렇게 하면 상단의 여분의 패딩도 제거됩니다.

위의 많은 이전 답변들은 너무 진부합니다.만약 애플이 이 예상치 못한 행동을 고치기로 결정한다면, 그들은 미래에 언제든지 깨어질 것입니다.

문제의 근본 원인:

  1. a UITableView0.의 높이를 가진 사용하는 것을 않습니다.높이가 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;

스토리보드:

선택 취소하기만 하면 됩니다.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의 그룹화된 테이블 뷰였습니다. 제가 왜 그리고 어떻게 이것을 알게 되었는지는 잘 모르겠지만, 저에게는,tableViewHeaderUIView 어도는 .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 11Xcode 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의 답변 덕분입니다.이것이 나의 해결책입니다.

이 문제의 원인:-

  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 
}

내 생각에 그것은 단지 새로운 것의 일부일 뿐입니다.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

문서화되어 있지 않은.

기괴하고 미묘한 고치야 ->

테이블 보기는 요즘 매우 이상한 동작을 합니다.

  1. 노치(XR 등)가 있는 장치에서는 테이블이 화면의 실제 상단에서 시작하는 경우에만 추가 삽입을 지시하지 않고 추가합니다.

  2. 화면 맨 위에서 시작하지 않으면 그렇지 않습니다.

  3. 모두 관련이 없는 두경모 >>입니다.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

반응형