UINavigationBar가 iOS 7에서 상단을 덮지 않도록하는 방법은 무엇입니까?


99

Xcode 5로 업데이트 한 후 내 앱의 모든보기에서 탐색 모음이 아래로 이동했습니다. 다음은 몇 가지 스크린 샷입니다. 첫 번째는 아래로 당겨진 뷰의 모든 것을 보여주고 두 번째는 모든 것을 그대로 보여줍니다. 검색 표시 줄은 탐색 표시 줄에서 시작해야합니다.

모든 콘텐츠 유휴 상태의 모든 콘텐츠

누구든지 내가 이것을 고칠 수있는 방법을 알고 있습니까?

편집 : 나는 이전 에이 권장 사항을 시도했습니다.

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

그러나 그것은 매우 이상한 결과를 낳습니다.

솔루션 시도

이것은 내비게이션 바의 투명성으로 인해 나타나는이 뷰 컨트롤러 아래에 "슬라이드 메뉴"가 있기 때문일 수 있습니다.


여기에이 문제에 대한 또 다른 해결책이 있습니다. stackoverflow.com/a/51491645/10148333
Afonso

답변:


235

탐색 모음의 반투명 속성을 NO로 설정합니다 .

self.navigationController.navigationBar.translucent = NO;

이렇게하면 탐색 표시 줄과 상태 표시 줄 아래에 표시되는보기가 수정됩니다.

탐색 모음을 표시하고 숨겨야하는 경우

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

당신의 viewDidLoad방법에.


1
나는 이것을 아래에 두 viewDidLoad었지만 아무런 변화가 없습니다.
Sam D20 2013 년

13
viewDidLayoutSubviews의 funtions에 그것을 만들
힌두교

1
이것을 viewDidLayoutSubviews에 추가하면 트릭이 발생했습니다. 도와 주셔서 감사합니다!
Sam D20 2013 년

안녕하세요, 질문 있어요? 아니면 칭찬입니까?
Hindu

1
self.edgesForExtendedLayout = UIRectEdgeNone; 저를 도와
luky

32

에서 iOS 7기본값으로 모든 컨트롤러 반투명 속성 값은 NO 반투명 속성을 설정하므로, YES없는 이 문제에 대한.

self.navController.navigationBar.translucent = NO;

2
"navController"속성이 없습니다. 이것을 사용하십시오 : self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan

앱 대리자에서 navigtionbarcontroller 개체를 만들고 navController라는 이름을 지정합니다.
Sumit Mundra

21

이 화면의 View Controller 속성 검사기에서 "Extend edge"를 비활성화 할 수 있습니다 (아래 이미지 참조).

여기에 이미지 설명 입력


12

이것은 iOS 8.1에서도 신속하게 작동합니다.

navigationController?.navigationBar.translucent = false

8

에서 반투명도를 유지하려면 navigationBar끝에 viewDidLoad또는 다음 viewWillAppear코드 줄을 추가하십시오.

[self.view sendSubviewToBack:self.tableView]

어쨌든 scrollView하위 클래스 ( UITableView, UICollectionView등)가 index현재보기 에서 0에 subviews있으면 navigationBar. 또한 iOS7 이전 버전의 UI에도 영향을 미치지 않아야합니다.


편집UITableView 프로그래밍 방식으로 초기화 하면 이것을 사용하여 뷰에 추가하는 것이 가장 좋습니다.[self.view insertSubview:self.tableView atIndex:0];


정답이되어야합니다. 프로그래밍 방식으로 하위 뷰를 추가하는 경우 추가 한 [self.view insertSubview:self.tableView atIndex:0];후 뒤로 보내는 대신 수행 할 수 있습니다 .
smitt04 2014 년

옳은. 그러나 그가 컨트롤러 (프로그래밍 방식, 인터페이스 빌더)를 어떻게 시작하는지 모르면 이것이 최상의 솔루션이라고 가정 할 수 없습니다. 내 대답을 편집했지만.
jbouaziz

이것은 작동하지만 해킹처럼 보입니다. 이에 대한 공식 문서에 공지가 있습니까?
John Tracid

4

스위프트 4 :

viewDidLoad 메서드에서 다음 코드 줄을 설정합니다.

self.navigationController?.navigationBar.isTranslucent = false

3

다음 URL에 표시된대로이 메서드를 뷰 컨트롤러에 추가 할 수 있습니다 .

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

또 다른 접근 방식은 self.automaticallyAdjustsScrollViewInsets = YES;뷰 컨트롤러 에서 설정 하는 것입니다. 이것은 기본적으로 활성화되어 있습니다. 그러나 귀하의 경우 :

EGORefreshHeaderView를 사용하고 있습니다. UITableView의 contentInset과 함께 재생됩니다. 그래서 당신이 그것을 놓으면 헤더는 이전 값을 복원하는 대신 상단 삽입을 재설정합니다.


-1

뷰를 완벽하게 제어하고 iOS의 잘못된 조정을 피하려면 UITableView를 하위 클래스로 만들고-(void) willMoveToWindow : (UIWindow *) newWindow에서 삽입 (스크롤 및 표시기 모두)을 조정합니다. 나를 위해 작동합니다.


-4

또 다른 옵션은 소스 코드 모드에서 Info.plist 파일을 열고 다음 정보를 입력하는 것입니다.

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

도움이 되었기를 바랍니다.


1
나는 이것이 뷰에 전혀 영향을 미치지 않을 것이라고 생각합니다.
Enrico Susatyo 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.