iOS 7 : 상태 표시 줄 아래에 UITableView가 표시됨


219

내 응용 프로그램의 첫 번째 화면 UITableViewController에는 탐색 표시 줄 이 없습니다. 즉, 내용이 상태 표시 줄 아래로 흐르므로 많은 텍스트 충돌이 발생합니다. 두 속성을 모두 조정했습니다.Under top bars 하고 Adjust scroll view insets있는 사실에서 스크롤을 중지 않지만, 아래 테이블 뷰의 상단을 유지하는 비용. UITableView프레임을 20 픽셀 오프셋 으로 설정하려고 시도했지만 효과가없는 것 같습니다. 현재 iOS 6과 호환되는 앱이 필요하므로 자동 레이아웃을 사용하도록 iOS 7 스토리 보드로 이동할 수 없습니다 상단 높이 가이드. 누구든지 두 버전 모두에서 작동하는 솔루션을 찾았습니까?

내가 시도한 것 : 설정 edgesForExtendedLayout, 스토리 보드에서 설정 변경Under top bars 하고 Adjust scroll view, 새로운 영역으로 프레임을 강제.

그림은 천 단어의 가치가 있습니다. 상태 표시 줄 아래


2
빠른 해결 방법은 iOS 7에서 실행될 때 빈 20 픽셀 헤더를 테이블에 추가하는 것입니다.
— EricS

@EricS : 이미 UITableView헤더가 있으며 상태 표시 줄 아래로 흐릅니다.
— Nicholas Smith

iOS 6에서 자동 레이아웃 가이드를 사용하지 않는 이유는 무엇입니까? 효과가있다.
— Steven Fisher

답변:


366

이 복제에 관심이있는 사람은 다음 단계를 따르십시오.

  1. 새로운 iOS 프로젝트 생성
  2. 메인 스토리 보드를 열고 기본 / 초기화를 삭제하십시오 UIViewController
  3. UITableViewController객체 라이브러리에서 새 항목 을 드래그
  4. 초기 뷰 컨트롤러로 설정
  5. 테스트 데이터를 테이블에 공급

위의 단계를 수행하면 앱을 실행할 때 Xcode의 확인란을 "{Top, Bottom, Opaque} Bar 아래의 가장자리 확장"으로 조정하여 첫 번째 행이 상태 표시 줄 아래에 나타나지 않게하는 등 아무것도 작동하지 않습니다. 프로그래밍 방식으로이 문제를 해결할 수도 없습니다.

예를 들어, 위 시나리오에서는 다음과 같은 효과 가 없습니다 .

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

이 문제는 매우 실망 스러울 수 있으며 특히 Apple의 사전 배선 된 버그로 인해 Apple의 버그라고 생각합니다. UITableViewController 객체 라이브러리에서 입니다.

"매직 숫자 20"과 같은 "매직 숫자"형식을 사용하여이 문제를 해결하려는 모든 사람에게 동의하지 않습니다. 이런 종류의 밀접하게 결합 된 프로그래밍은 분명히 애플이 우리가 원하는 것이 아닙니다.

이 문제에 대한 두 가지 해결책을 발견했습니다.

  • 보존 UITableViewController의 장면을 :
    당신은 유지하려는 경우 UITableViewController수동으로 다른보기로 배치하지 않고, 스토리 보드에서, 당신은을 포함 할 수 있습니다 UITableViewControllerA의 UINavigationController인스펙터에서 (편집자> 삽입에서> 네비게이션 컨트롤러)의 선택을 취소 "쇼 탐색 막대" . 이를 통해 추가 조정이 필요없는 문제를 해결 UITableViewController하고 스토리 보드의 장면을 보존 할 수 있습니다 .

  • AutoLayout을 사용하고 UITableView다른보기에 포함 (Apple이 우리가 원하는 방식이라고 생각합니다) :
    빈을 UIViewController만들고 드래그하십시오 UITableView. 그런 다음 Ctrl 키를 누른 UITableView상태에서 상태 표시 줄을 향해 드래그하십시오 . 마우스가 상태 표시 줄의 맨 아래로 이동하면 "Top Layout Guide"라는 자동 레이아웃 풍선이 나타납니다. 마우스를 놓고 "수직 간격"을 선택하십시오. 레이아웃 시스템에 상태 표시 줄 바로 아래에 배치하도록 지시합니다.

빈 응용 프로그램에서 두 가지 방법을 테스트했으며 모두 작동합니다. 프로젝트에서 작동하도록 추가 조정을 수행해야 할 수도 있습니다.


5
참고로, 옵션 1 (탐색 컨트롤러에 임베드)을 사용하면 테이블을 스크롤 할 때 셀이 반투명 상태 표시 줄 뒤에 표시됩니다.
— RyanR

4
@RyanR 나도 그것을 알아 차 렸지만 어느 시점에서는 괜찮다고 생각합니다. Apple은 모바일 Safari의 열린 탭보기에서 동일한 작업을 수행했으며 상태 표시 줄 아래에 탭이 표시됩니다. 내비게이션 컨트롤러 솔루션은 가장 간단한 해결 방법입니다. 그러나 반투명 상태 표시 줄은 바보 같은 생각입니다.
— Pride Chung

6
tableview에서 control-drag를 수행하면 상태 표시 줄에 들어 가지 않습니다. 보기에 보이는 상태 표시 줄이 없습니다. 무슨 의미인지 잘 모르겠습니다 ...
— Jesse

4
옵션 2 는 더 이상 Xcode 5에서 작동하지 않습니다 . 설명 된 조치 (ctrl-drag)는 Outlets 시스템이 소유 한 것이므로 작동하지 않았어야하지만 왼쪽의 장면 트리로 수동으로 끌어도 상단 배치 안내서가 작동하지 않습니다 (이것은 AFAICT-이것은 AutoLayout의 또 다른 주요 버그라고 생각합니다 :( :()
— Adam

3
@PrideChung 테이블 뷰와 함께 헤더를 사용할 때 바보처럼 보이고 헤더는 맨 위에 고정되어 있으며 요소는 사라지고 투명 상태 표시 줄 뒤에 다시 나타납니다 ...
— Ixx

86

프로그래밍 방식으로 일을하고 최선의 방법 UITableViewController없이 사용하는 UINavigationController경우 다음을 수행하는 것입니다 viewDidLoad.

스위프트 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

이전 스위프트

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

는 UITableViewController여전히 상태 표시 줄 뒤로 스크롤하지만 정상에 스크롤 할 때 아래되지 않습니다.


1
OS 버전> 7에 대한 검사를 추가하고 이전 OS도 지원할 수 있습니다 (삽입되지 않음). 그렇지 않으면 이것은 내 목적을 위해 잘 작동했습니다.
— SimpsOff

8
하드 코딩 높이 값이 가장 좋은 방법은 아닙니다.
— Maciej Kozieł

3
예, topLayoutGuide대신 길이를 사용하십시오.
— lipka

10
UIApplication.sharedApplication.statusBarFrame.size.height20 대신에 사용 합니다.
— mojuba

요즘 UIApplication.shared.statusBarFrame.size.height로 업데이트되었습니다.
— asetniop 2016 년

23

참고 : 이것은 다음 구성에서 효과적이었습니다.

  • 화면 상단에 탐색 표시 줄이 없습니다 (테이블보기가 상태 표시 줄을 충족 함)
  • 테이블 뷰는 스크롤 할 수 없습니다

위의 두 가지 요구 사항이 충족되지 않으면 마일리지가 다를 수 있습니다.

원본 게시물

프로그래밍 방식으로 뷰를 만들었고 결국 나에게 도움이되었습니다.

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

출처 ( 39 페이지 하단의 topLayoutGuide 섹션).


흥미 롭습니다 ... 프로젝트에서 아무런 문제없이 호출 할 수 있었지만 ...보기 레이아웃 구조가 더 간단 할 수 있습니다. 당신의 제안이 맞습니다. 나는 그 대답을 바꿀 것입니다.
— Stunner

앱을 회전했을 때 문제가 발생했습니다. 회전을 사용 중지 한 경우 문제가 없을 수 있습니다.
— 제레미

내 프로젝트에서 회전을 사용할 수 없으며 문제가 발생했지만 여전히 좋은 지적입니다.
— Stunner

1
자신의 컨테이너 컨트롤러를 구현하는 사람이라면 이것이 겹치는 상태 또는 탐색 표시 줄을 올바르게 조정하는 방법입니다!
— Rafael Nobre

뷰 경계의 높이가 아닌 원점을 변경하면 화면의 아래쪽 가장자리에서 원점을 변경 한 양만큼 아래쪽이 잘리지 않습니까? (그래서 마지막 몇 행의 픽셀을 볼 수 없게됩니다)
— Tenfour04

20

최고 답변에 추가 :

두 번째 방법이 처음에는 효과가없는 것처럼 보였지만 추가 땜질을하고 해결책을 찾았습니다.

TLDR; 최상위 답변의 두 번째 솔루션은 거의 작동하지만 일부 버전의 xCode ctrl + dragging은 "Top Layout Guide"로 수직 간격을 선택해도 아무런 효과가 없습니다. 그러나 먼저 테이블 뷰의 크기를 조정 한 다음 "Top Space to Top Layout Guide"를 선택하면 작동합니다.


  1. 빈 ViewController를 스토리 보드로 드래그하십시오. 뷰 컨트롤러

  2. UITableView 객체 를 View로 드래그하십시오 . (UITableViewController가 아님). 파란색 레이아웃 안내선을 사용하여 가장 중앙에 배치하십시오.

테이블 뷰 센터 이미지

  1. UITableViewCell을 TableView로 드래그하십시오. 이것은 프로토 타입 재사용 셀이므로 속성 탭에서 재사용 식별자를 설정해야합니다. 그렇지 않으면 충돌이 발생합니다.

테이블 뷰 셀 추가 재사용 식별자

  1. UIViewController의 사용자 정의 서브 클래스를 작성하고 <UITableViewDataSource, UITableViewDelegate>프로토콜을 추가하십시오 . Identity Inspector에서 스토리 보드의 ViewController를이 클래스로 설정하는 것을 잊지 마십시오.

  2. 구현 파일에서 TableView에 대한 콘센트를 작성하고 이름을 "tableView"로 지정하십시오.

콘센트 만들기 tableView

  1. TableView를 마우스 오른쪽 단추로 클릭하고 dataSource 및 대리자를 ViewController로 끕니다.

dataSource 델리게이트

이제 상태 표시 줄에 클리핑하지 않는 부분에 대해 설명합니다.

  1. 테이블 뷰의 상단 가장자리를 잡고 상단 근처의 파란색 파선 자동 레이아웃 안내선 중 하나로 이동하십시오.

크기 조정

  1. 이제 테이블 뷰에서 상단으로 드래그를 제어하고 상단 공간에서 상단 레이아웃 안내를 선택할 수 있습니다.

상단 공간에서 상단 레이아웃 안내

  1. 누락 된 제약 조건 추가와 완료로 TableView의 모호한 레이아웃에 대한 오류가 발생합니다.

누락 된 구속 조건 추가

이제 테이블보기를 평소와 같이 설정할 수 있으며 상태 표시 줄을 자르지 않습니다!


11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1


2
<=를>로
— 바꾸고

1
읽기 self.topLayoutGuide.length에서하는 viewDidLayoutSubviews아이 뷰의 레이아웃을 망치는 것입니다.

설명에 따라 @OLzh는 self.tableView를 스크롤 할 수 없습니다.
— DawnSong

8

스토리 보드에서 UIViewController를 선택하고 상단 막대 아래 모서리 확장 옵션을 선택 취소하십시오. 나를 위해 일했다. :)


아아, 나를 위해 일하지 않았다. 완전히 기본 UITableViewController는 여전히 상태 표시 줄과 겹칩니다. 상태 표시 줄이 톱 바로 계산되지 않는다고 생각합니다. 탐색 막대와 탭 막대 만 있으면됩니다.
— 앤드류 던컨

나를 위해 작동하는 유일한 솔루션, ty. (IB의 상태 표시 줄 아래에서 테이블 뷰를 "축소"하고 구속 조건을 업데이트해야합니다.)
— Martin Makarsky

UITableViewController를 사용하여 Xcode 8에서 나를 위해 일했습니다.
— Edouard Barbier

8

이것은 "Swift"에 쓰는 방법입니다. @lipka의 답변에 대한 조정 :

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)

여기에 신속하게 허용되지 않습니까?
— uplearnedu.com

나에게있는 UIViewController 생성하지 않습니다 나를 위해 일한 유일한 해결책,
— Shereef Marzouk

1
심지어 iOS8의에서 디폴트 상태 표시 줄이없는 풍경에, 20에서 위쪽 인세를 유지하기 때문에이 덜 이상적입니다
— voidref

이 변형은 모든 구성을 잘 처리합니다.- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
— qix

5

Xcode 7의 경우 탐색 표시 줄의 '반투명'확인 표시를 선택 취소하면 나에게 도움이되었습니다.

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


가장 간단하고 빠르며 가장 쉽고 안전합니까? 해결책. 왜 이것이 다른 모든 것에 비해 공감대가 적은지 모릅니다.
— Gruntcakes

3

이것은 UITableViewController (매직 숫자없이)에 대해 수정합니다. 내가 고칠 수없는 유일한 것은 전화 통화 중 인 경우입니다.이 경우 tableView의 상단이 너무 많이 내려갑니다. 해결 방법을 아는 사람이 있으면 알려주십시오.

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}

2

나는 그것이 어떻게 정결한지 잘 모르겠지만,이 체계는 ViewController의 뷰를 아래로 이동시키고 상태 표시 줄에 견고한 배경을 제공한다는 것을 알았습니다.

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

물론 redColor배경색을 원하는 색으로 바꾸십시오 .

상태 표시 줄에서 문자 / 기호의 색상을 설정하려면 스위 즐 중 하나를 별도로 수행해야합니다. 나는 사용 View controller-based status bar appearance = NO하고Status bar style = Opaque black style PLIST,이 전 세계적으로 작업을 수행 할 수 있습니다.

작동하는 것 같습니다. 버그 나 문제가 있으면 관심이 있습니다.


2

chappjc의 답변은 XIB로 작업 할 때 효과적입니다.

프로그래밍 방식으로 TableViewControllers를 만들 때 가장 깨끗한 솔루션은 다른 UIViewController에 UITableViewController 인스턴스를 래핑하고 이에 따라 제약 조건을 설정하는 것입니다.

여기있어:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

건배, 벤


1

UITableViewController를 사용하는 방법은 이전과 약간 다를 수 있습니다. 그것은 나를 위해 일했지만 당신은 그것을 좋아하지 않을 수도 있습니다. 내가 한 일은 내 UItableViewController를 가리키는 컨테이너 뷰가있는 뷰 컨트롤러가 있습니다. 이 방법으로 스토리 보드에 제공된 TopLayoutGuide를 사용할 수 있습니다. 컨테이너 뷰에 제약 조건을 추가하기 만하면 iOS7과 iOS6을 모두 관리해야합니다.


1

원하는 배경의 추가 뷰 하나를 사용하여 TableView 다음에 추가하고 상태 표시 줄 아래에 배치했습니다.

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

매우 예쁘지는 않지만 xib-less 뷰 및 IOS6 및 IOS7 작업이 필요한 경우 다소 간단한 솔루션입니다.


1

나는 이것을 Retina / Non-Retina 디스플레이에 대해

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

1

다음 솔루션은 마법 상수를 사용하지 않고 코드에서 충분히 잘 작동하며, 예를 들어 ipad의 회전 또는 병렬 앱을 통해 크기 클래스를 변경하는 사용자를 설명합니다.

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}

1

신속한 3에 적합-viewDidLoad ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

이 코드는 다음과 같습니다. 1. 상태 표시 줄의 높이를 가져옵니다. 2. 테이블보기의 상단에 상태 표시 줄의 높이와 동일한 내용의 삽입물을 제공합니다. 3. 스크롤 표시기에 동일한 삽입을 제공하여 상태 표시 줄 아래에 나타납니다.


1

오히려 자신 UITableViewController을 포함하지 않는 나 같은 사람들 을 위해UIViewController시도 :

사용자 정의 UITableViewController서브 클래스는 tableView의 수퍼 뷰에 마스크 뷰를 추가 할 수 있습니다. viewDidAppear에 마스크를 추가하고 viewWillDisappear에서 마스크를 제거하십시오.

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}

0

UITableView 상단에 UISearchBar가 있었고 다음이 작동했습니다.

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

공유하고 즐기십시오 ...



0

Abrahamchez의 솔루션 https://developer.apple.com/library/ios/qa/qa1797/_index.html 은 다음과 같이 나를 위해 일했습니다. 초기 뷰로 단일 UITableviewcontroller가 있습니다. 나는 오프셋 코드를 시도하고 navcon에 포함했지만 상태 표시 줄 투명도를 해결하지 못했습니다.

Viewcontroller를 추가하고 초기보기로 만드십시오. 중요한 상단 및 하단 레이아웃 가이드가 표시됩니다.

기존 테이블 뷰를 새 컨트롤러의 뷰로 드래그하십시오.

새 컨트롤러에 테이블을 개조하기 위해 모든 것을 수행하십시오.

UITableViewController 대신 UIViewController에서 상속 / 서브 클래스로 이전보기 controller.h 파일을 변경하십시오.

UITableViewDataSource 및 UITableViewDelegate를 뷰 컨트롤러의 .h에 추가하십시오.

검색 창과 같이 스토리 보드에 필요한 모든 것을 다시 연결하십시오.

가장 중요한 것은 Apple Q & A에서와 같이 제약 조건을 설정하는 것입니다. 툴바 삽입을 귀찮게하지 않았습니다. 정확한 순서는 확실하지 않습니다. 그러나 레이아웃 가이드에 빨간색 아이콘이 나타 났을 것입니다. 나는 그것을 클릭하고 Xcode가 제약 조건을 설치 / 정리하도록했습니다.

그런 다음 수직 공간 제약 조건을 발견하고 최고 값을 -20에서 0으로 변경하고 완벽하게 작동 할 때까지 모든 곳을 클릭했습니다.


0

네비게이션 컨트롤러와 tableviewcontroller와 함께 UISplitViewController를 사용하고 있습니다. 이것은 많은 솔루션을 시도한 후에 마스터 뷰에서 나를 위해 일했습니다.

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

Hot Licks의 솔루션과 유사하지만 탐색 컨트롤러에 하위보기를 적용합니다.


이것은 iOS 8에서 나를 위해 일한 유일한 대답입니다!
— SamB

0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}

0

여기 스위프트 2.3이 있습니다. (Xcode 8.0) 솔루션. UITableView의 하위 클래스를 만들었습니다.

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

삽입 된 내용은 항상 0이어야합니다 (기본적으로). 수동으로 Zero로 설정하고 있습니다. 검사를 수행하는 검사 방법을 추가 할 수 있으며 원하는 검사 이외의 다른 것이 있으면 올바른 rect를 얻습니다. 변경 사항은 테이블 뷰가 그려 질 때만 반영됩니다 (자주 발생하지는 않음).

IB에서 TableView를 업데이트하는 것을 잊지 마십시오 (TableViewController에서 또는 ViewController 내의 TableView에서).


0

나는 ios 11 에서이 문제에 직면했지만 ios 8-10.3.3에 대해서는 레이아웃이 정확했습니다. 필자의 경우 수직 공간 제약 조건을 Superview.Top 대신 Superview.Top Margin으로 설정했습니다 .ios 8-11에서 작동합니다.

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


0

난 당신 탭 표시 줄의 테이블 뷰 내부를 추가하는 특히 것은 처음입니다,이 작업을 수행하는 가장 쉬운 방법을 찾아 보기를 추가 하고 그 내부보기 테이블보기를 추가 . 이것은 당신이 찾고있는 최고의 마진 가이드를 제공합니다.

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


-1

모든 솔루션보기 : 내 프로젝트는 xib를 사용하므로 스토리 보드가있는 솔루션은 효과가 없었습니다. self.edgesForExtendedLayout = UIRectEdgeNone; 네비게이션 바가 보이는 경우 컨트롤러에서만 작동합니다. 그러나보기에 상태 표시 줄이 있으면 작동하지 않습니다. 그래서 나는 두 개의 조건을 결합합니다.

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

이 작업을 도와주세요.


-2

iOS 6도 지원해야하는 경우 조건부로 아래로 이동해야합니다. 즉, iOS 7에서는 frame조작 또는 자동 레이아웃을 통해 20 포인트 아래로 이동해야 하며 iOS 6에서는 그대로 두어야합니다. IB 에서이 작업을 수행 할 수 있다고 생각하지 않으므로 코드로 수행해야합니다.

편집하다

iOS6 / iOS7 델타를 사용하여 실제로 IB에서이를 수행 할 수 있습니다. iOS 7에서 위치를 설정 한 다음 iOS 6의 경우 델타 Y를 -20 포인트로 설정하십시오. 자세한 내용은 이 SO 질문 을 참조하십시오.


프레임을 내려 놓아도 불행히도 변경되지는 않습니다.
— Nicholas Smith

작동하지 않는 것은 무엇입니까? 테이블 뷰가 아래로 이동하지 않습니까?
— Scott Berrevoets

예, 같은 위치에 남아 있습니다. 나는 시도했다 self.view.frame및 self.tableView.frame모두에서, viewWillAppear그리고 viewDidLoad. 안전 setContentNeedsDisplay을 위해 다시 그리기를 강제로 설정 했습니다.
— Nicholas Smith

자동 레이아웃이 활성화되어 있습니까?
— Scott Berrevoets

예, 자동 레이아웃 및 스토리 보드입니다.
— Nicholas Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.