Строка состояния и панель навигации проблема в IOS7
я переношу свое приложение на iOS 7. Для передачи вопроса строки состояния я добавил этот код
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f)
{
CGRect frame = self.navigationController.view.frame;
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
frame.origin.y = 20;
}
else
{
frame.origin.x = 20;
}
[self.navigationController.view setFrame:frame];
}
это работает нормально в обычном случае. Если я меняю ориентацию (приложение поддерживает только альбомную ориентацию) или представляю любой контроллер вида и отклоняю контроллер вида модели, мое выравнивание контроллера вида изменилось. Строка состояния снова перекрывает мой контроллер вида. Этот кусок кода не работает вообще. Пожалуйста, направьте меня, чтобы исправить эту проблему в строке состояния.
случай 2: Вот как я представляю свой контроллер вида
ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
reader.supportedOrientationsMask = ZBarOrientationMaskLandscape;
else
reader.supportedOrientationsMask = ZBarOrientationMaskPortrait;
[self presentModalViewController:reader animated:YES];
Ref:
спасибо заранее.
11 ответов:
Исправлена ошибка строки состояния в IOS 7
наконец, я исправил строку состояния над проблемой круга, используя свойство delta value в xcode5. Сначала у меня увеличение origin-y 20pxl для всех контроллеров, используемых в Xib(это швы, чтобы работать нормально только в IOS 7), после этого я установите Дельта-значение для всех контроллеров вида origin-y до -20 он отлично работает как в ios 6, так и в IOS 7.
шаги для этого.
Xcode 5 предоставляет возможность предварительного просмотра для просмотра внешнего вида xib в другом виде на основе версии ОС.
выберите опцию предварительного просмотра от помощника редактора
нажмите помощник редактора
и выберите опцию предварительного просмотра для предварительного просмотра выбранного контроллера вида в другой версии.
просмотр контроллера просмотр опции предварительного просмотра.
в окне предварительного просмотра вы можно найти опцию переключения для предварительного просмотра в другой версии. В предварительном просмотре вы можете четко почувствовать проблему со строкой состояния, если она не исправлена должным образом путем переключения версии.
три шага, чтобы исправить проблему в статус баре : Шаг 1: убедитесь, что просмотр целевой us 7.0 и более поздних версий в инспекторе файлов.
Шаг 2: Увеличьте начало координат-y с 20 пикселей (точно размер строки состояния) для всех элементов управления, добавленных в вид контроллер.
Шаг 3: Установите Дельта-значение origin y в -20 для всех элементов управления тогда только он будет автоматически регулировать в зависимости от версии. Используйте предварительный просмотр сейчас и почувствуйте разницу, что элементы управления автоматически настраиваются из-за значения дельты.
Как только проблема строки состояния Исправлена, проблема при представлении представления модели (контроллер ZbarSDk) также исправлена автоматически.
экран предварительного просмотра :
Я опоздал на этот ответ, но я просто хочу поделиться тем, что я сделал, что в принципе
элемент простое решениепервый из всех - > иди к своему
info.plist File
и добавить стиль строки состояния - > прозрачный черный стиль (Альфа 0,5)Итак ,вот он идет:-
добавьте этот код в свой AppDelegate.м
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Whatever your code goes here if(kDeviceiPad){ //adding status bar for IOS7 ipad if (IS_IOS7) { UIView *addStatusBar = [[UIView alloc] init]; addStatusBar.frame = CGRectMake(0, 0, 1024, 20); addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar [self.window.rootViewController.view addSubview:addStatusBar]; } } else{ //adding status bar for IOS7 iphone if (IS_IOS7) { UIView *addStatusBar = [[UIView alloc] init]; addStatusBar.frame = CGRectMake(0, 0, 320, 20); addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern [self.window.rootViewController.view addSubview:addStatusBar]; } return YES; }
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; self.window.rootViewController = self.viewController; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; self.window.clipsToBounds =YES; self.window.frame =CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20); } [self.window makeKeyAndVisible]; return YES; }
установите следующее значение в info.файл plist
внешний вид строки состояния на основе контроллера = нет;
чтобы скрыть строку состояния в ios7 выполните следующие простые шаги:
в Xcode goto"
Resources
" папку и откройте "(app name)-Info.plist file
".
- регистрация для "
View controller based status bar appearance
"ключ и установить его значение"NO
"- регистрация для "
Status bar is initially hidden
"ключ и установить его значение"YES
"если ключей нет, то вы можете добавить его, выбрав"
information property list
" сверху и нажмите +
ГОРАЗДО более простой ответ:
выровняйте верхнюю часть вашего представления с "верхним руководством по компоновке", но перетащите" верхнее руководство по компоновке "на ваш вид и установите ограничение" вертикаль". посмотреть этот ответ для справки изображения.
Как это работает - "руководство по макету сверху" будет автоматически настраиваться, когда строка состояния есть или нет, и все это будет работать - не требуется кодирование!
P. S. В этом особенности например, фон, показываемый внизу, также должен быть разрешен путем установки соответствующего вертикального ограничения нижней части представления, чтобы это был супервизор или что-то еще...
услышать, что мы можем сделать это для всех сразу
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Notification for the orientaiton change [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; // Window framing changes condition for iOS7 or greater if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, -20, self.window.frame.size.width, 20)];//statusBarBackgroundView is normal uiview statusBarBackgroundView.backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.730]; [self.window addSubview:statusBarBackgroundView]; self.window.bounds = CGRectMake(0, -20, self.window.frame.size.width, self.window.frame.size.height); } // Window framing changes condition for iOS7 or greater self.window.rootViewController = navigationController; [self.window makeKeyAndVisible]; return YES; }
и пока мы используем ориентацию, мы можем добавить ниже метод в делегате приложения, чтобы установить его через ориентацию.
- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification { if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { statusBarBackgroundView.hidden = YES; UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; int width = [[UIScreen mainScreen] bounds].size.width; int height = [[UIScreen mainScreen] bounds].size.height; switch (orientation) { case UIInterfaceOrientationLandscapeLeft: self.window.bounds = CGRectMake(-20,0,width,height); statusBarBackgroundView.frame = CGRectMake(-20, 0, 20, height); break; case UIInterfaceOrientationLandscapeRight: self.window.bounds = CGRectMake(20,0,width,height); statusBarBackgroundView.frame = CGRectMake(320, 0, 20, height); break; case UIInterfaceOrientationPortraitUpsideDown: statusBarBackgroundView.frame = CGRectMake(0, 568, width, 20); self.window.bounds = CGRectMake(0, 20, width, height); break; default: statusBarBackgroundView.frame = CGRectMake(0, -20, width, 20); self.window.bounds = CGRectMake(0, -20, width, height); break; } statusBarBackgroundView.hidden = NO; } }
вы должны добавить ниже категории навигационного контроллера для него
.h
#import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> @interface UINavigationController (iOS6fix) @end
.м
#import "UINavigationController+iOS6fix.h" @implementation UINavigationController (iOS6fix) -(BOOL)shouldAutorotate { return [[self.viewControllers lastObject] shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [[self.viewControllers lastObject] supportedInterfaceOrientations]; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; } @end
Я решил это с помощью кода ниже
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if(landScape mode) if ([UIDevice currentDevice].systemVersion.floatValue>=7) { CGRect frame = self.window.frame; frame.size.width -= 20.0f; frame.origin.x+= 20.0f; self.window.frame = frame; } if(portrait) if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 7.0) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; CGRect frame = self.window.frame; frame.origin.y += 20.0f; frame.size.height -= 20.0f; self.window.frame = frame; } return YES; }
#define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) if (_kisiOS7) { [[UINavigationBar appearance] setBarTintColor:_kColorFromHEX(@"#011C47")]; } else { [[UINavigationBar appearance] setBackgroundColor:_kColorFromHEX(@"#011C47")]; [[UINavigationBar appearance] setTintColor:_kColorFromHEX(@"#011C47")]; }
просто установите следующий код в
viewWillAppear
.if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) { self.edgesForExtendedLayout = UIRectEdgeNone; }
С Salesforce SDK 2.1 (Cordova 2.3.0) нам нужно было сделать следующее, чтобы строка состояния отображалась при начальной загрузке приложения и возвращалась из фона (iPhone и iPad):
в отличие от других решений, опубликованных здесь, этот, кажется, переживает вращение устройства.
1-создать Категорию
SFHybridViewController
#import "SFHybridViewController+Amalto.h" @implementation SFHybridViewController (Amalto) - (void)viewWillAppear:(BOOL)animated { //Lower screen 20px on ios 7 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { CGRect viewBounds = self.view.bounds; viewBounds.origin.y = 20; viewBounds.size.height = viewBounds.size.height - 20; self.webView.frame = viewBounds; } [super viewWillAppear:animated]; } - (void)viewDidLoad { if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { CGRect viewBounds = self.view.bounds; viewBounds.origin.y = 20; viewBounds.size.height = viewBounds.size.height - 20; self.webView.frame = viewBounds; } [super viewDidLoad]; } @end
2-добавить
AppDelegate.m
импорт#import "SFHybridViewController+Amalto.h"
3-впрыснуть в конце метода
didFinishLaunchingWithOptions
наAppDelegate
//Make the status bar appear if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; }
4-добавить
App-Info.plist
свойства
View controller-based status bar appearance
со значениемNO
есть несколько различных способов. Один из подходов заключается в использовании .plist file
- Добавить новый ключ " внешний вид строки состояния на основе контроллера" и задайте значение "нет".
- добавить еще один ключ"строка состояния изначально скрыта" и задайте значение "да".
это скроет строку состояния по всему проекту.