UITableView는 iOS 7에서 오프셋으로 시작됩니다.


115

일반 jane UITableView를 iOS 7의 UIViewController로 드래그했습니다.

이제 첫 번째 셀이 시작되기 전에 공간의 수직 오프셋이 있습니다. 어떻게 제거합니까? 첫 번째 줄이 UITableView가 실제로 시작되는 위쪽 가장자리에 훨씬 더 가깝기를 원합니다. 나는 큰 오프셋을 요구하지 않았습니까?

여기에 이미지 설명 입력

어떤 아이디어?


43
나는 다음의 도움을 받았다 : YouStoryboard.storyboard> YouViewController> Attributes inspector> Uncheck-Adjust scroll view insets.
Alexander

17
BTW, 당신이 사용하는 iOS 시뮬레이터의 화면을 캡처 할 수 Command 키 + S
Hemang

@Alexander : 귀하의 제안에도 도움을 받았지만 ExtendEdges.UnderTopBars를 선택 취소하면 수직 오프셋 공간이 다시 나타납니다. Xcode6의 (많은?) 버그 중 하나인지 확실하지 않지만 이러한 문제로 인해 가끔씩 두통이 발생합니다!
iOS-Coder

답변:


81

기본적으로 테이블 뷰 컨트롤러는 내비게이션 바 아래에 콘텐츠를 패딩하므로 콘텐츠를 스크롤하여 내비게이션 바 / 툴바 아래에서 흐릿한 상태로 볼 수 있습니다.

탐색 막대 아래에서 이동하기 위해 44 (아마 64) px에 배치하는 것처럼 보이지만 이미이를 보완하므로 큰 간격이 생깁니다.

IB의 스토리 보드 / xib로 이동하여 탐색 모음 항목 아래에있는 쇼 콘텐츠를 선택 해제합니다.


6
죄송합니다. iOS7의 NDA에 대한 댓글이 어떻게 무관합니까? 사람들을 돕는 포럼입니다.
Cocoadelica

Viewcontroller의 Xcode 버전 5.1에서 확장 된 가장자리 제거> 상단 막대 아래에서 상단 UITableView 콘텐츠 삽입 제거
Emel Elias

3
그렇다면 내비게이션 바 thigo 아래의 쇼 콘텐츠는 어디에 있습니까? 찾을 수 없습니다.
Anup Kattel 2014

10
Xcode 5.1.1의 @FrankGorman에는 특정 뷰 컨트롤러에 대한 스토리 보드 옵션이 Adjust Scroll View insets있습니다. 체크 표시를 제거합니다.
korat prashant 2014 년

1
안녕 @koratprashant. 매우 유용한 댓글입니다.
KDeogharkar

107

UIViewController 의 새로운 iOS 7 구현 에는 개발자가 시스템이 UIScrollView , UITableView에 대한 삽입을 자동으로 추가할지 여부를 선택할 수있는 새로운 옵션 세트가 있습니다. 및 파생에 .

인터페이스 빌더에서 모든 원 UIViewControllers에 대한이 상자의 선택을 취소이 동작을 해제하려면에 있는 UIViewController 객체 관리자를 선택 :

컨트롤러 검사기보기

상세 사항은:

  1. 지금 iOS 7 앱을 제출하세요.
  2. iOS 7 UI 전환 가이드> 모양 및 동작

감사! 넌 나를 구했다.
rsc

68

iOS7 전환 가이드에서 :

스크롤 뷰의 콘텐츠 삽입이 자동으로 조정되지 않도록하려면 automaticAdjustsScrollViewInsets를 NO로 설정하십시오. (autoAdjustsScrollViewInsets의 기본값은 YES입니다.)

   self.automaticallyAdjustsScrollViewInsets = NO;

9
속성 검사기의 XCode에서 설정할 수도 있습니다. Adjust Scroll View Insets보기 컨트롤러 레이아웃 의 확인란을 선택 취소합니다 .
Andrew

1
UIViewController를 프로그래밍 방식으로로드하면 (XIB를 사용하지 않고) 이것은 매력처럼 작동합니다. automaticallyAdjustsScrollViewInsets = NO뷰 컨트롤러에서 설정 합니다.
KabraBoja 2014

이것은 나를위한 것이었다. 내 TableView가 컨테이너 뷰 안에 있었고 처음에는 잘 보였기 때문에 혼란 스럽습니다. 그러나 다른 뷰 컨트롤러에서 다시 튀어 나올 때 망가졌습니다.
n13

큰! 많은 시간을 절약하세요!
inix

34

비슷한 문제가 발생했습니다. viewController를 닫은 후 내 tableView의 contentOffset이 (0, -64)로 변경되었습니다.

내 솔루션은 약간 이상했습니다. 다른 모든 답변을 시도했지만 성공하지 못했습니다. 내 문제를 해결 한 유일한 방법은 .xib의 컨트롤 트리에서 tableView 위치를 전환하는 것입니다.

다음과 같은 상위 뷰의 첫 번째 컨트롤입니다.

전에

ImageView 바로 뒤에 tableView를 옮겼고 작동했습니다.

후

테이블 뷰를 첫 번째 위치에 두는 것이 문제를 일으키는 것으로 보이며 테이블 뷰를 다른 위치로 이동하면 문제가 해결되었습니다.

PD 나는 autoLayout도 스토리 보드를 사용하지 않는다

이것이 누군가를 도울 수 있기를 바랍니다!


나는 똑같은 것을 발견했다! 추가 뷰를 넣지는 않지만 UITableView -44 상단을 이동하는 간격을 간단하게 보완합니다. IB에서는 -64px를 이동해야하지만 런타임에서 -64px로 인해 tablview가 탐색 모음을 오버레이하고 -44px는 괜찮습니다. 나는 그것을 설명 할 수 없다. iPhone 스토리 보드에서 비슷한 문제가 발견되지 않았을 때 iPad 팝 오버보기에서이 문제를 발견했습니다.
Mike Keskinov 2014

이 문제는 uiview에서도 발생합니다. 사용자 인터페이스에 표시된보기가 동일한 순서로 배치되지 않은 경우.
Rinku 2014 년

2
오늘 XCode 6.1에서 동일한 문제가 발생했습니다. ... 애플의 버그를 해결하려고 낭비 또 다른 2-3 시간까지 분필
마이크 Gledhill에게

3
이것은 매우 도움이되었고 더 많은주의를 기울여야합니다! 뷰 컨트롤러 설정이나 콘텐츠 삽입 / 오프셋을 조작하는 데 도움이되지 않았지만 스토리 보드에서 뷰 순서를 변경하면 문제가 해결되었습니다.
Caleb

1
애플, 내 말은 ... WTF? 감사합니다. 이것은 자동 레이아웃으로 스토리 보드를 수정했습니다.
Borzh

30

내 비슷한 문제를 해결합니다.

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}

1
이 방법으로 시스템 버전을 확인해야합니다.if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes

이것은 내가 가지고 있던 간격 문제에 대해 나를 위해 일했지만 이제는 당겨서 새로 고침 제어 스피너가 부분적으로 가려지고 상위 메뉴 아래에 표시됩니다. 이것도 본 사람 있나요? 해결 방법이 있습니까?
Nick

@ nickv2002는 프로그래밍 방식으로있는 tableView를 만들려고
알렉스

다른 모든 솔루션을 시도했지만이 솔루션 만 저에게
효과적

13

이것을 사용해보십시오

tableView.separatorInset = UIEdgeInsetsZero;

분명히 iOS7 미만을 지원하는 경우 객체를 호출하기 전에이 선택기에 응답하는지 확인해야합니다.


4
이것이 투표되는 이유가 확실하지 않습니다. separatorInset은 뷰의 가장자리에서 삽입되는 셀 사이의 거리 선을 변경합니다. 문제는 위의 세포 아래의 공간에 대한 요구하고있다
렘브란트 Q. 아인슈타인

이미지는 오해의 소지가 있지만 여백 문제에 대한 일반적인 Google 검색에서이 페이지가 표시됩니다.

9

진지하게, 변화 contentOffset는 해결책이 아닙니다. 문제를 패치하고 원인을 고치는 것이 아닙니다. 나는 같은 문제에 직면 해 왔으며 그룹화 된 tableViews 상단에 패딩이 있음이 밝혀졌습니다 . 제 경우에는 유형을 일반으로 설정하는 것이 트릭을 수행했습니다.

누군가가 몇 분을 절약 할 수 있기를 바랍니다. 지.


1
내가 그것을 완전히 기뻐 난 당신의 대답 upvote에 발견 놓친
AamirR

8

아이폰 OS 9으로,이 페이지에서 다른 답변 중 어느 것도 설정, 스토리 보드에서 (나를 위해, 즉 선택 취소 상자를 일하지 automaticallyAdjustsScrollViewInsetsNO ).

내가 정말 불만족스러운 해결 방법은 다음과 같습니다.

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

동일한 라인 viewWillAppear또는 viewDidLoad효과가 있었다.


이것은 uitableviewcontroller iOS 9에 대한 유일한 대답이어야합니다. 정말, 다른 도움이되지 않았습니다. 모두 시도해 보았습니다. 어디에서 찾았습니까? 어떻게 알아 냈습니까? many 10x
Erez

을 선택 취소 Adjust Scroll View insets체크 박스는 아이폰 OS 9 작동
아담

다른 솔루션에서 작동하지 않는 Scroll View 삽입을 조정합니까?
Yogesh Patel

5

간혹 내비게이션 컨트롤러에 내장되어 64있을 때 테이블 뷰 상단에 높이 간격 UIViewController이 생깁니다.

여기에 이미지 설명 입력

과거에는 모든 것을 재창조하고 깨끗한 슬레이트 후에 제약 조건이 정확 해지기를 바랐습니다.

TIL : 당신이에 수직 구속을하지 않으려면 Top Layout Guide, 당신은 아래로 저장할 수있는 Option액세스에 대한 키를 Container Margin.

여기에 이미지 설명 입력

그런 다음 Top Space to Superview상수가로 설정되어 있는지 확인하십시오 0. 이것은 적어도 나를 위해 일했습니다.

여기에 이미지 설명 입력


1,5 년 후, 그러나 그것은 나의 저녁을 해결했습니다. 감사!
asp_net

4

이것은 나를 위해 작동합니다.

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

2

UITableView 앞에 빈 UIView를 추가하면 (또는 ScrollView 및 TextView와 같은 모든 뷰를 스크롤 할 수 있음) 운이 좋을 수 있습니다.


1

컨테이너 뷰에 UITableViewController가 포함되어 있습니다. 불필요한 64 포인트의 수직 공간을 없애기 위해 Interface Builder에서 'Adjust Scroll View Insets'의 선택을 취소하고 UITableViewController의 viewWillAppear에서 UITableView의 contentInset을 아래와 같이 설정해야했습니다.

세로 공간의 크기는 탐색 모음의 프레임 높이 및 y 오프셋과 일치하는 것으로 나타납니다. 문제는 iOS 7에서만 발생했습니다.

- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}

1

Xamarin iOS에서는 포 그라운드 모달 대화 상자가 해제 된 직후 백그라운드 UITableViewController에서이 문제가 발생했습니다. 포 그라운드로 이동하는 과정에서 UITableViewController에는 인세 트가 설정되어 있습니다 (iOS의 어딘가에 있음).

이 수업은 그것을 해결했습니다.

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}

1

때때로 나는이 끔찍한 상황으로 되돌아 가는데, 그것이 여전히 잘 알려지지 않았다는 것을 알게됩니다. 그래서, 미래의 기억을 위해 ...

최근에이 해결 방법으로 수정하고 있습니다.

  1. 픽셀 높이가 0 인 UITableView 맨 위에 하위보기를 추가합니다. 자동 레이아웃을 사용하거나 사용하지 않고 작동합니다.
  2. 확신이 들면 :-)이 가짜 뷰를 제거하고 상단의 제약 조건을 수정하면 마술처럼 작동합니다.

이유를 묻지 마십시오. 여전히 UIKit의 버그라고 생각합니다.


0

스토리 보드로 이동하면 테이블을 선택하여 오프셋을 변경할 수 있으며 Attributes inspector의 Table View 섹션에서 왼쪽의 Separator Insets를 0으로 변경하면됩니다.


0

실제 해결책은 tableview의 상단 및 하단 제약 조건을 topMargin 및 bottomMargin과 동일하게 설정하는 것입니다. 상단 레이아웃 가이드와 하단 레이아웃 가이드가 아닙니다. 이렇게하면 automaticAdjustsScrollViewInsets를 true로 유지할 수 있습니다.


0

Swift 3 솔루션 :

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}

0

TableViewController를 NavigationController 또는 ContainerView에 포함시킨 경우 You have to constraint to margins instead of top Layout guide in Storyboard. Check constraint to margins when you are doing the constraints나를 위해 일한 다른 방법은 없습니다. 나는 코멘트를 할 수 없었기 때문에 Robert Chens의 대답을 반복하고 있습니다.


0

몇 가지 답변을 시도했습니다. 스토리 보드에서 설정을 변경하면 왼쪽에서 나타나는 오버레이 메뉴에 잔물결 문제가 발생했습니다.

스토리 보드에 빈 UIViewController 만 있습니다. 그렇지 않으면 모든 것이 프로그래밍 방식으로 생성됩니다.

UIViewController 내부의 UIView 내부의 UITableView와 동일한 문제가 있습니다. 즉, UIViewController가 탐색 컨트롤러에 포함 된 경우 섹션 헤더가 너무 아래로 시작됩니다. 탐색 컨트롤러가 없으면 모든 것이 잘 작동합니다.

문제를 해결하기 위해 UILabel을 생성하고 제약 조건을 사용하여 UILabel 하단 제약 조건 = UIView의 상단 제약 조건 (화면에 표시되지 않음)을 배치했습니다. 이제 추가 컨트롤 (새 레이블)을 사용하면 TableView가 제대로 작동합니다.

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true

0

iOS 11 및 xib, UITableviewController에서 동일한 문제가 발생했으며 다음과 같이 해결했습니다.

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.