나는이 ViewController
돌며이다 UINavigationcontroller
, 그러나 내비게이션 바는 숨겨져 있습니다. iOS 7에서 앱을 실행하면보기 상단에 상태 표시 줄이 표시됩니다. 이것을 피할 수있는 방법이 있습니까?
OS 별 코드를 작성하고 싶지 않습니다.
로 설정 View controller-based status bar appearance
을 시도했지만 NO
문제가 해결되지 않았습니다.
나는이 ViewController
돌며이다 UINavigationcontroller
, 그러나 내비게이션 바는 숨겨져 있습니다. iOS 7에서 앱을 실행하면보기 상단에 상태 표시 줄이 표시됩니다. 이것을 피할 수있는 방법이 있습니까?
OS 별 코드를 작성하고 싶지 않습니다.
로 설정 View controller-based status bar appearance
을 시도했지만 NO
문제가 해결되지 않았습니다.
답변:
Xcode 5는 iOS 6/7 Deltas
이 문제를 해결하기 위해 특별히 제작되었습니다. 스토리 보드에서 iOS 7에서 제대로 보이도록 뷰를 20 픽셀 아래로 이동했고 iOS 6과 호환되도록 Delta y
하기 위해 -20으로 변경 했습니다.
내 스토리 보드가 자동 레이아웃을 사용하지 않기 때문에, 아이폰 OS 6 I에서 제대로 뷰의 높이의 크기를 조정하기 위해 설정했다 Delta height
뿐만 아니라 Delta Y
.
상태 표시 줄을 전혀 원하지 않는 경우 다음 데이터로 plist를 업데이트해야합니다. 이렇게하려면 plist에서 다음 두 가지 설정을 추가합니다.
<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
iOS 7에서는 오버레이 투명 상태 표시 줄을 염두에두고 앱을 디자인해야합니다. 예를 들어 새로운 iOS 7 날씨 앱을 참조하십시오.
이것은 UIViewController
iOS 7의 기본 동작입니다 .보기는 전체 화면이되며 이는 상태 표시 줄이보기의 상단을 덮을 것임을 의미합니다.
당신이있는 경우 UIViewController
내 UINavigationController
와 내비게이션 바는 볼 수, 당신은 당신의 다음 코드를 가질 수 viewDidLoad
또는 내비게이션 바 트릭을 할 배경 이미지를 가지고있다.
self.edgesForExtendedLayout = UIRectEdgeNone;
navigationBar를 숨긴 경우 20 포인트를 이동하여 모든 UIView 요소를 조정해야합니다. 다른 해결책은 보이지 않습니다. 자동 레이아웃을 사용하면 조금 도움이됩니다.
이전 버전과의 호환성을 원하는 경우 iOS 버전을 감지하는 샘플 코드는 다음과 같습니다.
NSUInteger DeviceSystemMajorVersion() {
static NSUInteger _deviceSystemMajorVersion = -1;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *systemVersion = [UIDevice currentDevice].systemVersion;
_deviceSystemMajorVersion = [[systemVersion componentsSeparatedByString:@"."][0] intValue];
});
return _deviceSystemMajorVersion;
}
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
내가 만든 유일한 솔루션입니다.
내 UIViewController 하위 클래스 https://github.com/comonitos/ios7_overlaping
UIViewController의 하위 클래스 1 개
2 해당 클래스에서 window.rootViewController를 하위 클래스로 지정합니다.
3 짜잔!
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect screen = [[UIScreen mainScreen] bounds];
if (self.navigationController) {
CGRect frame = self.navigationController.view.frame;
frame.origin.y = 20;
frame.size.height = screen.size.height - 20;
self.navigationController.view.frame = frame;
} else {
if ([self respondsToSelector: @selector(containerView)]) {
UIView *containerView = (UIView *)[self performSelector: @selector(containerView)];
CGRect frame = containerView.frame;
frame.origin.y = 20;
frame.size.height = screen.size.height - 20;
containerView.frame = frame;
} else {
CGRect frame = self.view.frame;
frame.origin.y = 20;
frame.size.height = screen.size.height - 20;
self.view.frame = frame;
}
}
}
}
4 [self.window makeKeyAndVisible] 바로 뒤에 상태 표시 줄을 흰색으로 만들려면 이것을 추가합니다. !!!
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
-(void)viewWillLayoutSubviews{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
{
self.view.clipsToBounds = YES;
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenHeight = 0.0;
if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
screenHeight = screenRect.size.height;
else
screenHeight = screenRect.size.width;
CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20);
CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil];
if (!CGRectEqualToRect(screenFrame, viewFrame1))
{
self.view.frame = screenFrame;
self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}
}
}
plist에 키 추가 ---보기 컨트롤러 기반 상태 표시 줄 모양 : 아니요
ios7에서 상태 표시 줄을 숨기려면 다음 간단한 단계를 따르세요.
Xcode에서 " Resources
"폴더로 이동하여 " (app name)-Info.plist file
"를 엽니 다 .
View controller based status bar appearance
"키를 확인 하고 값을 " NO
"로 설정하십시오.Status bar is initially hidden
"키를 확인 하고 값을 " YES
"로 설정하십시오.키가 없으면 information property list
상단에서 " "를 선택 하고 + 아이콘을 클릭 하여 추가 할 수 있습니다.
완전히 숨기고 처리하지 않으려면 잘 작동합니다.
-(BOOL) prefersStatusBarHidden
{
return YES;
}
xib
s를 사용 하는 경우 매우 쉬운 구현은 뷰 계층 구조가 다음과 같이 보이도록 크기 조정 플래그 (이미 3.5 "및 4"호환성을 위해 사용하게 될)를 사용하여 컨테이너 뷰 내부의 모든 하위 뷰를 캡슐화 하는 것 입니다.
그런 다음에서 다음 viewDidLoad
과 같이하십시오.
- (void)viewDidLoad
{
[super viewDidLoad];
// initializations
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) // only for iOS 7 and above
{
CGRect frame = containerView.frame;
frame.origin.y += 20;
frame.size.height -= 20;
containerView.frame = frame;
}
}
이렇게하면 iOS 7 호환성을 위해 펜촉을 수정할 필요가 없습니다. 배경이 있으면 외부에 containerView
두고 전체 화면을 덮을 수 있습니다 .
Vincent의 답변 edgeForExtendedLayout이 저에게 효과적이었습니다.
이 매크로는 OS 버전을 결정하는 데 도움이되므로
// 7.0 and above
#define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
// 6.0, 6.0.x, 6.1, 6.1.x
#define IS_DEVICE_RUNNING_IOS_6_OR_BELOW() ([[[UIDevice currentDevice] systemVersion] compare:@"6.2" options:NSNumericSearch] != NSOrderedDescending)
이 매크로를 프로젝트의 prefix.pch 파일에 추가하고 어디서나 액세스 할 수 있습니다.
if(IS_DEVICE_RUNNING_IOS_7_AND_ABOVE())
{
//some iOS 7 stuff
self.edgesForExtendedLayout = UIRectEdgeNone;
}
if(IS_DEVICE_RUNNING_IOS_6_OR_BELOW())
{
// some old iOS stuff
}
나는 이것과 같은 질문으로 다른 게시물에 대한 내 답변을 게시했습니다.
Apple iOS7 전환 가이드에서 https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1
특히 automaticallyAdjustsScrollViewInsets=YES
와 set self.edgesForExtendedLayout = UIRectEdgeNone
나를위한 작품 나는 중복 싶지 않고 내가있을 때 tableviewcontroller
.
YTPlayer의 가로보기에서 돌아온 후 내 상태 표시 줄과 탐색 표시 줄이 겹칩니다. @comonitos 버전을 시도한 후 내 솔루션이 있지만 iOS 8에서는 작동하지 않습니다.
- (void)fixNavigationBarPosition {
if (self.navigationController) {
CGRect frame = self.navigationController.navigationBar.frame;
if (frame.origin.y != 20.f) {
frame.origin.y = 20.f;
self.navigationController.navigationBar.frame = frame;
}
}
}
내비게이션 바의 위치를 고정하고 싶을 때마다이 함수를 호출하면됩니다. 나는 YTPlayerViewDelegate의playerView:didChangeToState:
- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state {
switch (state) {
case kYTPlayerStatePaused:
case kYTPlayerStateEnded:
[self fixNavigationBarPosition];
break;
default:
}
}