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.frameself.tableView.frame모두에서, viewWillAppear그리고 viewDidLoad. 안전 setContentNeedsDisplay을 위해 다시 그리기를 강제로 설정 했습니다.
Nicholas Smith

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

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