새로운 iOS7 SDK가있는 뷰 위에 탐색 표시 줄이 나타납니다.


113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

이전 버전에서는 올바르게 작동합니다. 검색 표시 줄은 statusbar및 탐색 표시 줄 아래에 나타납니다 . tableview검색 창 아래에 표시됩니다

하지만에서 실행 Xcode 5 sdk iOS 7하면 검색 표시 줄이 표시되지 않고 (상태 표시 줄과 탐색 표시 줄 아래에있는 것으로 생각합니다) 테이블보기 위에 탐색 표시 줄이 나타납니다.

iOS 7안정적인 릴리스 로 수정 됩니까?

아니면 내 코딩의 문제입니까?

아니면 y (y = statubar height + nav bar height)값을 추가하여 처리해야 iOS 7합니까?

최근에 iOS 7에서 내 앱을 테스트하기 위해 Xcode 5 DP를 다운로드했습니다. 가장 먼저 눈치 채고 확인한 것은 상태 표시 줄과 탐색 표시 줄을 고려하여보기의 경계 크기가 항상 조정되는 것은 아니라는 것입니다.

viewDidLayoutSubviews에서 뷰의 경계를 인쇄합니다.

{{0, 0}, {320, 568}}

그 결과 내 콘텐츠가 탐색 표시 줄과 상태 표시 줄 아래에 나타납니다.

메인 화면의 높이를 가져 와서 상태 표시 줄의 높이와 내비게이션 막대의 높이를 빼서 높이를 직접 계산할 수 있다는 것을 알고 있지만 불필요한 추가 작업처럼 보입니다.

다른 사람이이 문제를 경험 한 적이 있습니까?

최신 정보:

이 특정 문제에 대한 해결책을 찾았습니다. 탐색 모음의 반투명 속성을 NO로 설정합니다.

self.navigationController.navigationBar.translucent = NO;

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

그러나 내비게이션 바를 반투명하게하려는 경우에 대한 수정 사항을 찾지 못했습니다. 예를 들어, 사진을 전체 화면으로 볼 때 내비게이션 바가 반투명하고 그 아래에 뷰가 표시되도록하고 싶습니다. 작동하지만 내비게이션 바 표시 / 숨기기를 전환 할 때 더 이상한 결과를 경험했습니다. 첫 번째 하위 뷰 (a UIScrollView)는 매번 변경된 경계 y 원점을 가져 옵니다 .


4
베타 소프트웨어. Apple 개발자 포럼이 더 적절합니다. 또한 문제는 전환 가이드에 명시 적으로 언급되어 있습니다.
Sulthan 2013-08-14

답변:


188

그것은 전적으로 사실이 아닙니다. iOS 7에는 이전 버전의 iOS에서와 같이 레이아웃 동작을 조정할 수있는 새로운 속성이 도입되었습니다. 이 코드 조각을 뷰 컨트롤러에 넣으면 잘 될 것입니다! 내비게이션 바가 차지하는 공간은 자동으로 고려되어야합니다.

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

-(void)viewDidLoad방법에 위의 내용을 추가해야합니다 .

참고 : API가 베타 버전에서 변경되었으므로 현재 iOS 7 및 Xcode 5의 최신 GM 릴리스를 사용해야합니다.


내 코드에는 EdgeForExtendedLayout이 있습니다. 선언되지 않은 식별자 UIExtendedEdgeNone을 사용합니다. 도와주세요.

6
UIRectEdgeNone으로 변경되었습니다.
Simon

6
이것이 바로 여기에서 그러한 질문에 대해 묻거나 대답해서는 안되는 이유입니다.
Sulthan 2013-08-14

ios6와의 호환성을 유지하려면 컨트롤러에 해당 속성이 있는지 확인하기 위해 코드별로 조건부 케이스를 도입해야하는 이유를 이해할 수 없습니다.
jerrygdm

12
뷰가 UINavigationController에 포함 된 경우에만 작동하는 것 같습니다.
pojo 2013-09-16

37

스토리 보드의 스크린 샷

Storyboard에서 작업하는 경우 (강력히 권장합니다!) 이것이 해결책입니다. Storyboard에서 ViewController의 "Extend Edges"를 비활성화 할 수 있습니다. 각 viewController에 대해이 작업을 수행해야합니다. stortyboard에서 viewController 아이콘 (보기 자체 아래에있는 productOwner 옆에 있음)을 클릭 한 다음 속성 검사기를 선택하여 확장 된 가장자리를 비활성화 할 수 있습니다 (이미지 표시와 유사).

이것은 또한 iOS 6과 같은 정렬 선을 설정합니다.

xCode 5의 또 다른 훌륭한 도구는 "미리보기"입니다. 집사 버튼 (보조 편집기)을 클릭하고 미리보기를 선택합니다. 여기에서 iOS 6을 선택하고 iOS 6에서 스토리 보드 디자인이 어떻게 보이는지 확인할 수 있습니다.

그저 훌륭합니다 : D

[최신 정보]

주의 : "가장자리 확장"을 비활성화하면 앱이 iOS7에서 백그라운드로 전환 될 때 탐색 모음에 검은 색 빛이 표시 될 수 있습니다. 글로우는 멀티 태스킹보기에서도 볼 수 있습니다 (홈 버튼을 두 번 누름). 이 문제는 내비게이션 바보기의 배경색을 흰색으로 설정하여 해결할 수 있습니다.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];

네, 이것이 스토리 보드 관점에서 오는 솔루션입니다. 감사합니다.
jpittman 2014

12

OP가 말했듯이 탐색 모음을 불투명하게 설정하는 간단한 해결책이 있습니다. 코드에서이 작업을 수행하는 대신 루트 탐색 모음에 대해 "반투명"을 선택 취소하면됩니다.

여기에 이미지 설명 입력


8

self.edgesForExtendedLayout=UIRectEdgeNone;

iOS 7 시뮬레이터 (Xcode 5 DP5)에서 작동합니다.


2
이것은 ios7에서 잘 작동하지만 ios 6 및 이전 버전에서 앱을 다시 실행하면보기가 위로 이동합니다. 이것에 대한 해결책이 있습니까?. 또한 각 뷰 컨트롤러에서이 속성을 설정해야합니다.
loganathan

: 현재 아이폰 OS가이 경우에 7 인 경우 당신은 항상 확인하실 수 있습니다if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel 총

2

이 답변은 모두 유용했습니다. 특히 MQoder의 경우에는 기본 상단 표시 줄을 "불투명 한 검정색 탐색"으로 설정해야했습니다.

여기에 이미지 설명 입력


1

@One Man Crew의 대답은 맞지만 :

이전 버전에서 앱을 실행할 때 오류를 방지하려면이 코드를 사용하는 것이 좋습니다.

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif

0

self.edgesForExtendedLayout = UIRectEdgeNone;

그리고 AppDelegate # application : didFinishLaunchingWithOptions에서이 작업을 수행해야합니다.

self.window.backgroundColor = [UIColor whiteColor];

그렇지 않으면 내비게이션 바의 배경색이 회색으로 바뀝니다. 투명한 탐색 모음이 창과 겹치기 때문입니다.


0

사용자가 테이블보기를 스크롤 할 때 투명도를 유지하려면 contentInset을 설정할 수 있습니다.

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

-1

한 가지 해결책은 내비게이션 컨트롤러를 사용하는 것입니다. 이것은 자동으로 문제를 해결합니다. 또한 베타 버전이므로 Xcode Preview 버전 대신 Xcode 5를 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.