최근 에 iOS 7에서 내 앱을 테스트하기 위해 Xcode 5 DP를 다운로드했습니다 . 가장 먼저 확인하고 확인한 것은 상태 표시 줄과 탐색 표시 줄을 고려하여보기의 경계가 항상 크기 조정되지는 않는다는 것입니다.
에서 viewDidLayoutSubviews
, 나는 뷰의 경계를 인쇄 :
{{0, 0}, {320, 568}}
이로 인해 내 컨텐츠가 탐색 표시 줄 및 상태 표시 줄 아래에 나타납니다.
메인 화면의 높이를 가져 와서 상태 표시 줄의 높이와 탐색 표시 줄의 높이를 빼면 키를 직접 계산할 수 있지만 불필요한 추가 작업처럼 보입니다.
이 문제를 어떻게 해결할 수 있습니까?
최신 정보:
이 특정 문제에 대한 해결책을 찾았습니다. 탐색 모음의 반투명 속성을 NO로 설정하십시오.
self.navigationController.navigationBar.translucent = NO;
탐색 표시 줄과 상태 표시 줄 아래에 프레임이 표시되지 않도록 수정합니다.
그러나 탐색 막대를 반투명하게하려는 경우에 대한 수정 사항을 찾지 못했습니다. 예를 들어, 사진을 전체 화면으로 볼 때 탐색 모음을 반투명하게 만들고 그 아래에보기 프레임을 만들고 싶습니다. 작동하지만 탐색 모음 표시 / 숨기기를 전환하면 이상한 결과가 발생했습니다. 첫 번째 하위 뷰 (UIScrollView)는 매번 변경되는 원점 범위를 가져옵니다.
답변
edgesForExtendedLayout
iOS7 SDK에서 새로운 속성을 구현하여이를 달성 할 수 있습니다 . 이를 위해 다음 코드를 추가하십시오.
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
-(void)viewDidLoad
메소드에 위의 내용을 추가해야합니다 .
iOS 7에서는 UI 모양을 레이아웃하고 사용자 정의하는 방법에 몇 가지 변경 사항이 있습니다 . 뷰 컨트롤러 레이아웃, 색조 색상 및 글꼴의 변경 사항은 앱의 모든 UIKit 객체에 영향을줍니다 . 또한 제스처 인식기 API가 향상되어 제스처 상호 작용을보다 세밀하게 제어 할 수 있습니다.
뷰 컨트롤러 사용
iOS 7에서 뷰 컨트롤러는 전체 화면 레이아웃을 사용합니다. 동시에 iOS 7을 사용하면 뷰 컨트롤러가 뷰를 배치하는 방식을보다 세밀하게 제어 할 수 있습니다. 특히 전체 화면 레이아웃 개념은보기 컨트롤러가보기의 각 가장자리 레이아웃을 지정할 수 있도록 개선되었습니다.
wantsFullScreenLayout
현재 지정하면 뷰 컨트롤러 속성은 아이폰 OS 7에 사용되지wantsFullScreenLayout = NO
는 아이폰 OS 7에서 실행될 때, 뷰 컨트롤러가 예기치 않은 화면 위치에 내용을 표시 할 수 있습니다.뷰 컨트롤러가 뷰를 배치하는 방법을 조정하려면
UIViewController
다음 속성을 제공하십시오.
- edgeForExtendedLayout
이
edgesForExtendedLayout
속성은UIRectEdge
none과 all을 지정하는 것 외에도 사각형의 네 가장자리 각각을 지정 하는 유형을 사용합니다 .edgesForExtendedLayout
막대 반투명도에 관계없이 확장해야하는 뷰의 모서리를 지정하는 데 사용 합니다. 기본적으로이 특성의 값은입니다UIRectEdgeAll
.
- extendedLayoutInpasOpaqueBars를 포함합니다
설계에서 불투명 막대를 사용하는 경우 특성을
NO로edgesForExtendedLayout
설정하여 세분화 하십시오 . (의 기본값 은 NO 입니다.)extendedLayoutIncludesOpaqueBars
extendedLayoutIncludesOpaqueBars
- 자동으로 ScrollViewInsets 조정
원하지 않는 경우 스크롤 뷰의 내용 세트는 자동으로 설정을 조정할 수
automaticallyAdjustsScrollViewInsets
에 NO . (기본값automaticallyAdjustsScrollViewInsets
은 YES 입니다.)
- topLayoutGuide, bottomLayoutGuide
topLayoutGuide
및bottomLayoutGuide
특성은 도면 컨트롤러의 뷰의 상부 또는 하부 에지 바의 위치를 나타낸다. 막대가 뷰의 상단 또는 하단과 겹치면 Interface Builder를 사용topLayoutGuide
하여 bottomLayoutGuide 의 하단 또는 상단에 구속 조건을 작성하여 막대를 기준으로 뷰를 배치 할 수 있습니다 . 막대가 뷰와 겹치지 않아야하는 경우 하단은
topLayoutGuide
뷰의 상단과bottomLayoutGuide
같고 상단은
뷰의 하단과 같습니다. 두 속성 모두 요청시 느리게 생성됩니다.
애플 독을 참조하십시오
답변
모든 것을 얼마나 멀리 떨어 뜨릴지를 계산할 필요가 없습니다.이 속성이 내장되어 있습니다. Interface Builder에서 뷰 컨트롤러를 강조 표시 한 다음 속성 관리자로 이동합니다. 여기에서 “Extend Edges”옆에 확인란이 있습니다. 보시다시피, 첫 번째 스크린 샷에서 기본 선택은 내용이 상단 및 하단 막대 아래에 표시되고 불투명 막대 아래에는 표시되지 않기 때문에 막대 스타일을 반투명하지 않도록 설정하는 것이 좋습니다.
첫 번째 스크린 샷에서 볼 수 있듯이 탐색 막대 아래에 두 개의 UI 요소가 숨겨져 있습니다. (IB에서 와이어 프레임을 사용하여이를 설명했습니다.) UIButton 및 UISegmentedControl 요소는 모두 “y”원점이 0으로 설정되어 있으며 뷰 컨트롤러는 상단 막대 아래의 콘텐츠를 허용하도록 설정되어 있습니다.
이 두 번째 스크린 샷은 “상단 바 아래”확인란을 선택 취소 할 때 발생하는 상황을 보여줍니다. 보다시피, 뷰 컨트롤러 뷰는 y 원점이 네비게이션 바 바로 아래에 위치하도록 적절하게 아래로 이동되었습니다.
또한의 사용법을 통해 프로그래밍 방식으로 수행 할 수 있습니다 -[UIViewController edgesForExtendedLayout]
. 다음은 edgeForExtendedLayout 및 UIRectEdge 에 대한 클래스 참조에 대한 링크 입니다 .
[self setEdgesForExtendedLayout:UIRectEdgeNone];
답변
프로그래밍 방식으로 뷰를 만들었고 결국 나에게 도움이되었습니다.
- (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 섹션).
답변
iOS 10 이상에서 NIB / XIB 파일과 함께 작동하는 Swift 3 / Swift 4 솔루션 :
override func viewDidLoad() {
super.viewDidLoad()
edgesForExtendedLayout = []
}
답변
뷰에 반투명 탐색 막대가 표시되도록하려면 contentInset 또는 유사 항목을 설정해야합니다.
내가하는 방법은 다음과 같습니다.
// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;
myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}
답변
edgesForExtendedLayout
그러나 iOS 7 SDK를 통해 앱을 빌드하고 iOS 6에 배포하면 탐색 표시 줄이 반투명으로 표시되고보기가 그 아래로 이동합니다. 따라서 iOS 7과 iOS 6 모두에서 수정하려면 다음을 수행하십시오.
self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific
답변
앱 plist 파일에서 행을 추가하고 “컨트롤러 기반 상태 표시 줄보기”라고하고 NO로 설정하십시오 .