programing

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

padding 2023. 5. 28. 20:24
반응형

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

애플리케이션의 첫 은 내지서첫화은면의입니다.UITableViewController탐색 모음이 없으면 상태 표시줄 아래로 내용이 이동하므로 텍스트 충돌이 많이 발생합니다.두 가지 속성을 모두 조정했습니다.Under top bars그리고.Adjust scroll view insets아래로 스크롤하는 것을 실제로 막지만 표 보기의 맨 위를 아래로 유지하는 비용이 듭니다.설정을 시도했습니다.UITableView프레임에서 20픽셀 오프셋을 수행하지만, 적용되지 않는 것 같습니다. 현재 iOS 6과 호환되도록 앱이 필요하기 때문에 iOS 7 Storyboards로 이동하여 상단 높이 가이드를 사용하도록 강제로 자동 레이아웃할 수 없습니다.두 버전 모두에 적합한 솔루션을 찾은 사람이 있습니까?

시도한 : 설정하기: 설정하기edgesForExtendedLayout for Storyboard Under top bars그리고.Adjust scroll view프레임을 새 영역으로 강제 이동합니다.

: 그은천마말디보더다가있습치다니가의림▁is▁a있다습니▁words▁a▁worth▁thousand:가치가.상태 표시줄 흐름 아래

이 복제에 관심이 있는 사용자는 다음 단계를 수행하십시오.

  1. 새 iOS 프로젝트 만들기
  2. 합니다.UIViewController
  3. 새항끌기오를 .UITableViewController
  4. 초기 보기 컨트롤러로 설정
  5. 테이블에 테스트 데이터를 제공합니다.

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

예: 위의 시나리오에서는 다음과 같은 사항이 적용되지 않습니다.

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

이 문제는 매우 좌절감을 줄 수 있으며, 특히 사전 배선된 자체에 표시되기 때문에 애플 측의 버그라고 생각합니다.UITableViewController개체 라이브러리에서.

저는 "20px의 델타 사용"과 같은 "매직 넘버"를 사용하여 이 문제를 해결하려는 모든 사람에게 동의하지 않습니다.이런 긴밀하게 결합된 프로그래밍은 분명히 애플이 여기서 우리가 하기를 원하는 것이 아닙니다.

이 문제에 대한 두 가지 해결책을 찾았습니다.

  • 장면 보존:
    만약 당신이 그것을 유지하고 싶다면.UITableViewController스토리보드에서, 수동으로 다른 뷰에 배치하지 않고, 당신은 그것을 내장할 수 있습니다.UITableViewController순식간에UINavigationController(Editor > Embed In > Navigation Controller)는 "Show Navigation Bar(내비게이션 바 표시)"입니다.이렇게 하면 추가적인 조정이 필요 없이 문제를 해결할 수 있으며, 고객의 요구 사항을 충족할 수 있습니다.UITableViewController의 장면이 스토리보드에 있습니다.

  • AutoLayout을 사용하고 를 다른 보기포함(Apple은 이렇게 하기를 원합니다):
    빈항만을 만듭니다.UIViewController그리고 당신의 것을 끕니다.UITableView그 다음에 여러분의 그에에서 . 그리고 나서, Ctrl 키를 누르면서 당신의UITableView상태 표시줄로 이동합니다.마우스가 상태 표시줄의 아래쪽으로 이동하면 "Top Layout Guide(상부 레이아웃 가이드)"라는 자동 레이아웃 버블이 표시됩니다.마우스를 놓고 "수직 간격"을 선택합니다.그러면 레이아웃 시스템에서 상태 표시줄 바로 아래에 배치하도록 지시합니다.

빈 애플리케이션에서 두 가지 방법을 모두 테스트해 보았는데 둘 다 작동합니다.프로젝트에 사용할 수 있도록 추가 조정이 필요할 수 있습니다.

으로 어떤 , 를 사용하고 있다면,UITableViewControllerUINavigationController의 방법은 당의최선방다하것다니입에서 입니다.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상태 표시줄 뒤로 계속 스크롤되지만 맨 위로 스크롤할 때는 해당 아래에 있지 않습니다.

참고:이 작업은 다음 구성에 적합합니다.

  • 화면 상단에 탐색 모음이 없음(테이블 보기가 상태 표시줄과 일치)
  • 테이블 보기를 스크롤할 수 없습니다.

위의 두 가지 요구 사항이 충족되지 않을 경우 주행 거리가 달라질 수 있습니다.

원본 게시물

프로그래밍 방식으로 보기를 생성하여 다음과 같은 작업을 수행했습니다.

- (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페이지 하단의 레이아웃 가이드 섹션에 있음).

상위 답변에 추가:

두 번째 방법이 처음에는 작동하지 않는 것처럼 보인 후 추가적인 수정 작업을 수행하여 해결책을 찾았습니다.

TLDR: 상위 답변의 두 번째 솔루션은 거의 작동하지만 일부 xCode ctrl+일부 버전에서는 "상위 레이아웃 가이드"로 끌어서 수직 간격을 선택해도 아무런 효과가 없습니다.그러나 먼저 표 보기의 크기를 조정한 후 "맨 위 공간에서 맨 위 레이아웃 가이드"를 선택하면 됩니다.


  1. 빈 뷰 컨트롤러를 스토리보드로 끕니다. 보기 컨트롤러

  2. UITableView 개체를 View(UITableViewController가 아님)로 끕니다.파란색 레이아웃 가이드를 사용하여 중앙에 배치합니다.

테이블 보기 중앙 이미지

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

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

  1. 정의 하고 UIViewController를 합니다.<UITableViewDataSource, UITableViewDelegate>의정서Identity 의 이 클래스로 설정하는 것을 잊지 스토리보드의 ViewController를 Identity Inspector의 이 클래스로 설정하는 것을 잊지 마십시오.

  2. 구현 파일에 TableView에 대한 배출구를 만들고 "tableView"라는 이름을 지정합니다.

아웃렛 만들기 테이블 뷰

  1. TableView를 마우스 오른쪽 버튼으로 클릭하고 dataSource와 대리자를 모두 ViewController로 끕니다.

dataSource 대리인

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

  1. 테이블 뷰의 위쪽 가장자리를 잡고 위쪽에 있는 파란색 점선 자동 레이아웃 가이드 중 하나로 아래로 이동합니다.

크기를 조정합니다.

  1. 이제 테이블 보기에서 맨 위로 드래그를 제어하고 맨 위 공간에서 맨 위 레이아웃 가이드를 선택할 수 있습니다.

상단 공간 대 상단 레이아웃 가이드

  1. 테이블 뷰의 모호한 레이아웃에 대한 오류를 제공합니다. 누락된 제약 조건을 추가하면 됩니다.

결측 구속조건 추가

이제 테이블 보기를 일반적인 것처럼 설정할 수 있습니다. 그러면 상태 표시줄이 클리핑되지 않습니다!

- (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

스토리보드에서 UIViewController를 선택하고 Extend Edges Under Top Bars 옵션을 선택 취소합니다.저를 위해 일했습니다. : )

"Swift"에 쓰는 방법 @lipka의 대답에 대한 조정:

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

Xcode 7의 경우 내비게이션 바에 대한 '반투명' 확인 표시를 해제하는 것이 효과가 있었습니다.

여기에 이미지 설명 입력

이렇게 하면 (마법 번호가 없는) UITableViewController용으로 수정됩니다.문제를 해결하지 못한 유일한 문제는 통화 중인 경우입니다. 이 경우 테이블 상단의 보기가 너무 아래로 밀려 있습니다.그것을 해결할 방법을 아는 사람이 있다면 우리에게 알려주시기 바랍니다.

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
    }
}

Kosher가 어떤지는 모르겠지만, 이 체계는 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플리스트에서, 이것을 전세계적으로 하기 위해서.

작동하는 것 같습니다. 버그나 문제에 대해 듣고 싶습니다.

Chappjc의 답변은 XIB와 함께 작업할 때 매우 효과적입니다.

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

여기 있습니다.

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]];

건배, 벤

swift 3에 대한 작업 - Inview DidLoad();

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. 스크롤 표시기에 상태 표시줄 아래에 표시되도록 동일한 내용을 삽입합니다.

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

원하는 배경을 가진 추가 보기를 사용하게 되었고, 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가 없는 보기와 IOS6 및 IOS7 모두를 사용하는 작업이 필요한 경우에는 간단한 솔루션입니다.

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;
}

다음 솔루션은 마법 상수를 사용하지 않고도 코드에서 충분히 작동하며, 예를 들어 회전 또는 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);
}

UITableView 상단에 UISearch Bar를 설치하고 다음 작업을 수행했습니다.

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

공유하고 즐기는 것...

크기를 자유형으로 설정하여 작업하게 되었습니다.

여기에 이미지 설명 입력

Abrahamchez의 솔루션 https://developer.apple.com/library/ios/qa/qa1797/_index.html 은 다음과 같이 작동했습니다.초기 뷰로 단일 UIT 테이블 뷰 컨트롤러를 사용했습니다.나는 오프셋 코드와 navcon에 내장을 시도했지만 둘 다 상태 표시줄 투명성을 해결하지 못했습니다.

View 컨트롤러를 추가하고 초기 보기로 만듭니다.중요한 상단 및 하단 레이아웃 가이드가 표시됩니다.

이전 테이블 보기를 새 컨트롤러의 보기로 끕니다.

테이블을 새 컨트롤러로 개조하기 위한 모든 작업을 수행합니다.

이전 viewcontroller.h 파일을 UITableViewController 대신 UIViewController에서 상속/하위 클래스로 변경합니다.

뷰 컨트롤러의 .h에 UITableViewDataSource 및 UITableViewDelegate를 추가합니다.

검색 표시줄과 같이 스토리보드에 필요한 모든 항목을 다시 연결합니다.

중요한 것은 Apple Q&A에서와 같이 제약 조건을 설정하는 것입니다.저는 도구 모음을 삽입할 필요가 없었습니다.정확한 순서는 확실하지 않습니다.하지만 제가 만들었을 때 레이아웃 가이드에 빨간색 아이콘이 나타났습니다.나는 그것을 클릭했고 Xcode가 제약 조건을 설치/정리하도록 했습니다.

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

내비게이션 컨트롤러와 테이블 뷰 컨트롤러가 있는 UISplitView 컨트롤러를 사용하고 있습니다.여기서 많은 솔루션을 사용해 본 결과 마스터 뷰에서 효과가 있었습니다.

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];
}

HotLicks의 솔루션과 비슷하지만 하위 보기를 탐색 컨트롤러에 적용합니다.

override func viewDidLoad() {
 // your code

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

다음은 Swift 2.3.(Xcode 8.0) 솔루션입니다.UITableView의 하위 클래스를 만들었습니다.

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

내용 삽입은 항상 0이어야 합니다(기본값).수동으로 0으로 설정하고 있습니다.또한 검사를 수행하는 검사 방법을 추가할 수 있으며, 원하는 것이 아니면 정확하게 확인할 수 있습니다.테이블 뷰가 그려질 때만 변경사항이 반영됩니다(자주 그려지지는 않음).

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

IOS 11에서 이 문제에 직면했지만 IOS 8 - 10.3.3에 대한 레이아웃이 정확했습니다. 저의 경우 수직 공간 제약 조건을 Superview로 설정했습니다.Superview 대신 상단 여백을 선택합니다.ios 8 - 11에 작동하는 상단.

여기에 이미지 설명 입력

나처럼 그들의 것을 포함하지 않는 것을 선호하는 사람들을 위해.UITableViewController순식간에UIViewController사용해 보십시오.

정의 »UITableViewController하위 클래스는 마스크 뷰를 테이블 뷰의 수퍼 뷰에 추가할 수 있습니다.viewDidDisparen 마스추고viewWillDisparen 마스제거다니합를크에에.

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
}

탭 표시줄 내부에 표 보기를 추가하는 경우에는 먼저 보기를 추가다음 해당 보기 내부에 보기를 추가하는 것이 가장 쉬운 방법임을 알게 되었습니다.이것은 당신이 찾고 있는 최고의 마진 가이드를 제공합니다.

여기에 이미지 설명 입력

모든 솔루션 보기: 내 프로젝트는 단지 xib를 사용하는 것이므로 스토리보드가 있는 솔루션은 나에게 적합하지 않습니다. self.edgeForExtendedLayout = 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;
    }
}

이 일을 도와주세요.

조건부로 iOS 6의 지원 대상입니다.즉, iOS 7 20포인트를 통해).frame조작 또는 자동 레이아웃 사용), iOS 6에서는 그대로 둡니다.IB에서는 이것을 할 수 없다고 생각하기 때문에 코드로 해야 할 것입니다.

편집

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

언급URL : https://stackoverflow.com/questions/18900428/ios-7-uitableview-shows-under-status-bar

반응형