Строка состояния iOS 7 возвращается к стилю iOS 6 по умолчанию в приложении iPhone?
В iOS 7 UIStatusBar
был разработан таким образом, что он сливается с представлением, как это:
(GUI разработан Тиной Тавчар)
Это круто, но это немного испортит ваш взгляд, когда у вас что-то будет в верхней части, и оно будет перекрываться строкой состояния.
Есть ли простое решение (например, установка свойства в info.plist), которое может изменить способ его работы (не перекрывая) обратно на то, как оно работает в iOS6?
Я знаю, что более простым решением будет иметь
self.view.center.x
+ 20 баллов за каждый контроллер вида, но их изменение приведет к изменению размеров (с другимself.view.center.x
может вызвать проблемы для пользовательских сегментов и т. д.) и вдруг это превращается в утомительную работу, которую лучше избегать.Я действительно буду рад, если кто-то может предоставить мне однострочное решение для этого.
PS Я знаю, что могу скрыть строку состояния, делая такие вещи, как
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
В didFinishLaunchingWithOptions
метод, но это обходной путь, ярлык, позволяющий избежать проблемы, поэтому я не считаю это реальным решением.
25 ответов
Это перекрестная публикация из сообщения в блоге, которое я написал, но вот полное краткое описание строк состояния, панелей навигации и контроллеров представления контейнера в iOS 7:
Нет способа сохранить макет строки состояния стиля iOS 6. Строка состояния всегда будет перекрывать ваше приложение на iOS 7
Не путайте внешний вид строки состояния с разметкой строки состояния. Внешний вид (светлый или по умолчанию) не влияет на расположение строки состояния (рамка / высота / перекрытие). Также важно отметить, что строка состояния системы больше не имеет цвета фона. Когда API ссылается на UIStatusBarStyleLightContent, они означают белый текст на чистом фоне. UIStatusBarStyleDefault - черный текст на чистом фоне.
Внешний вид строки состояния контролируется по одному из двух взаимоисключающих базовых путей: вы можете либо установить их программным способом традиционным способом, либо UIKit обновит внешний вид для вас на основе некоторых новых свойств UIViewController. Последний вариант включен по умолчанию. Проверьте значение plist вашего приложения для "Внешний вид строки состояния на основе ViewController", чтобы увидеть, какой из них вы используете. Если для этого значения задано значение YES, каждый контроллер представления верхнего уровня в вашем приложении (кроме стандартного контроллера представления контейнера UIKit) должен переопределить предпочитаемый StatusBarStyle, возвращая либо стиль по умолчанию, либо стиль освещения. Если вы измените значение plist на NO, то вы можете управлять внешним видом строки состояния, используя знакомые методы UIApplication.
UINavigationController изменит высоту своего UINavigationBar до 44 или 64 точек, в зависимости от довольно странного и недокументированного набора ограничений. Если UINavigationController обнаруживает, что вершина фрейма его вида визуально соприкасается с вершиной его UIWindow, то он рисует свою панель навигации с высотой 64 точки. Если его вершина не соприкасается с вершиной окна UIWindow (даже если она отклонена только на одну точку), то она рисует свою навигационную панель "традиционным" способом с высотой 44 точки. Эта логика выполняется UINavigationController, даже если в иерархии контроллера представления вашего приложения есть несколько дочерних элементов. Нет способа предотвратить такое поведение.
Если вы предоставляете пользовательское фоновое изображение панели навигации высотой всего 44 точки (88 пикселей) и границы представления UINavigationController совпадают с границами UIWindow (как обсуждалось в #4), UINavigationController будет рисовать ваше изображение в кадре (0,20,320,44), оставляя 20 точек непрозрачного черного пространства над вашим изображением. Это может сбить вас с толку, если вы думаете, что вы умный разработчик, который обошел правило № 1, но вы ошибаетесь. Панель навигации по-прежнему 64 балла. Внедрение UINavigationController в иерархию представлений стиля со слайдом для раскрытия делает это совершенно ясным.
Остерегайтесь запутанно названного свойства dgeForExtendedLayout UIViewController. Регулировка edgeForExtendedLayout в большинстве случаев ничего не делает. Единственный способ, которым UIKit использует это свойство, состоит в том, что если вы добавляете контроллер представления в UINavigationController, то UINavigationController использует dgeForExtendedLayout, чтобы определить, должен ли его дочерний контроллер представления быть видимым под областью панели навигации / строки состояния. Установка edgeForExtendedLayout в самом UINavigationController не влияет на то, имеет или нет UINavigationController область навигации с 44 или 64 точками. Смотрите # 4 для этой логики. Аналогичная логика компоновки применяется к нижней части вашего представления при использовании панели инструментов или UITabBarController.
Если все, что вы пытаетесь сделать, - это не допустить, чтобы ваш пользовательский дочерний контроллер представления перекрывал панель навигации, когда он находится внутри UINavigationController, то установите для dgeForExtendedLayout значение UIRectEdgeNone (или хотя бы маску, исключающую UIRectEdgeTop). Установите это значение как можно раньше в жизненном цикле вашего контроллера представления.
UINavigationController и UITabBarController также попытаются дополнить contentInsets табличных представлений и коллекционных представлений своей иерархией подпредставлений. Это происходит аналогично логике строки состояния из #4. Существует программный способ предотвратить это, автоматически устанавливая AdjustsScrollViewInsets в NO для ваших табличных представлений и представлений коллекции (по умолчанию YES). Это создает некоторые серьезные проблемы для Whisper и Riposte, поскольку мы используем настройки contentInset для управления макетом табличных представлений в ответ на движения панели инструментов и клавиатуры.
Повторим: нет способа вернуться к логике макета строки состояния в стиле iOS 6. Чтобы приблизиться к этому, вам нужно переместить все контроллеры представления вашего приложения в представление контейнера, которое смещено на 20 точек от верхней части экрана, оставляя намеренно черный вид за строкой состояния для имитации старого вида. Этот метод мы использовали в Riposte и Whisper.
Apple очень старается, чтобы вы не пытались сделать № 9. Они хотят, чтобы мы перепроектировали все наши приложения так, чтобы они перекрывали строку состояния. Однако существует множество убедительных аргументов как по пользовательскому опыту, так и по техническим причинам, почему это не всегда хорошая идея. Вы должны делать то, что лучше для ваших пользователей, а не просто следовать прихоти платформы.
Обновления от 19 сентября 2013 года:
исправлены ошибки масштабирования путем добавления
self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
исправлены опечатки в
NSNotificationCenter
заявление
Обновления от 12 сентября 2013 года:
исправленный
UIViewControllerBasedStatusBarAppearance
вNO
добавлено решение для приложений с поворотом экрана
добавлен подход для изменения цвета фона строки состояния.
По-видимому, нет способа вернуть строку состояния iOS7 обратно к тому, как она работает в iOS6.
Тем не менее, мы всегда можем написать некоторые коды и превратить строку состояния в iOS6-подобный, и это самый короткий способ, который я могу придумать:
Задавать
UIViewControllerBasedStatusBarAppearance
вNO
вinfo.plist
(Чтобы отказаться от наличия контроллеров представления, измените стиль строки состояния, чтобы мы могли установить стиль строки состояния с помощью метода UIApplicationstatusBarStyle.)В AppDelegate's
application:didFinishLaunchingWithOptions
, вызовif (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; self.window.clipsToBounds =YES; self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20); //Added on 19th Sep 2013 self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height); } return YES;
чтобы:
Проверьте, если это iOS 7.
Установите содержимое строки состояния белым, в отличие от UIStatusBarStyleDefault.
Избегайте появления подпредставлений, чьи рамки выходят за видимые границы (для видов, анимируемых в основной вид сверху).
Создайте иллюзию, что строка состояния занимает место, как в iOS 6, сместив и изменив размер окна приложения.
Для приложений с поворотом экрана
используйте NSNotificationCenter для обнаружения изменений ориентации путем добавления
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidChangeStatusBarOrientation:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];
в if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
и создайте новый метод в AppDelegate:
- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
int w = [[UIScreen mainScreen] bounds].size.width;
int h = [[UIScreen mainScreen] bounds].size.height;
switch(a){
case 4:
self.window.frame = CGRectMake(0,20,w,h);
break;
case 3:
self.window.frame = CGRectMake(-20,0,w-20,h+20);
break;
case 2:
self.window.frame = CGRectMake(0,-20,w,h);
break;
case 1:
self.window.frame = CGRectMake(20,0,w-20,h+20);
}
}
Чтобы при изменении ориентации он вызывал оператор switch для определения ориентации экрана приложения ("Портрет", "Перевернутый вниз", "Пейзаж влево" или "Пейзаж вправо") и соответственно изменял рамку окна приложения, создавая иллюзию строки состояния iOS 6.
Чтобы изменить цвет фона строки состояния:
добавлять
@property (retain, nonatomic) UIWindow *background;
в AppDelegate.h
делать background
свойство в вашем классе и помешать ARC отменить его. (Вам не нужно делать это, если вы не используете ARC.)
После этого вам просто нужно создать UIWindow в if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
:
background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)];
background.backgroundColor =[UIColor redColor];
[background setHidden:NO];
Не забудь @synthesize background;
после @implementation AppDelegate
!
ОБНОВЛЕНИЕ (НОВОЕ РЕШЕНИЕ)
Это обновление является лучшим решением проблемы с панелью навигации iOS 7. Вы можете установить пример цвета панели навигации: FakeNavBar.backgroundColor = [UIColor redColor];
Примечание. Если вы используете контроллер навигации по умолчанию, используйте старое решение.
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if(NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0)
{
UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
FakeNavBar.backgroundColor = [UIColor whiteColor];
float navBarHeight = 20.0;
for (UIView *subView in self.window.subviews) {
if ([subView isKindOfClass:[UIScrollView class]]) {
subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight);
} else {
subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height);
}
}
[self.window addSubview:FakeNavBar];
}
return YES;
}
СТАРЫЕ РЕШЕНИЯ - Если вы используете предыдущий код, пожалуйста, игнорируйте следующий код и изображение
Это старая версия решения для панели навигации iOS 7.
Я решил проблему с помощью следующего кода. Это для добавления строки состояния.
didFinishLaunchingWithOptions
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
UIView *addStatusBar = [[UIView alloc] init];
addStatusBar.frame = CGRectMake(0, 0, 320, 20);
addStatusBar.backgroundColor = [UIColor colorWithRed:0.973 green:0.973 blue:0.973 alpha:1]; //change this to match your navigation bar
[self.window.rootViewController.view addSubview:addStatusBar];
}
И для Интерфейсного Разработчика это для, когда вы открываете с iOS 6; это начинается с 0 пикселей.
РЕШЕНИЕ:
Установите его в вашем viewcontroller или в rootviewcontroller, переопределив метод:
-(BOOL) prefersStatusBarHidden
{
return YES;
}
Вот еще один подход для проектов, которые широко используют раскадровку:
ЦЕЛЬ:
Цель этого подхода - воссоздать тот же стиль строки состояния в iOS7, который был в iOS6 (см. Заголовок вопроса "Строка состояния iOS 7 Вернуться к стилю iOS 6?").
РЕЗЮМЕ:
Чтобы добиться этого, мы максимально используем раскадровку, смещая элементы пользовательского интерфейса, которые перекрываются строкой состояния (под iOS 7), вниз, в то же время используя дельты, чтобы отменить изменение макета вниз для iOS 6.1 или более ранней версии. Получающееся дополнительное пространство в iOS 7 затем занято UIView с backgroundColor, установленным в цвет по нашему выбору. Последний может быть создан в коде или с использованием раскадровки (см. АЛЬТЕРНАТИВЫ ниже)
Предположения:
Чтобы получить желаемый результат при выполнении следующих шагов, предполагается, что View controller-based status bar appearance
установлен на НЕТ, и что ваш Status bar style
либо установлен "Прозрачный черный стиль (альфа 0,5)", либо "Непрозрачный черный стиль". Обе настройки можно найти / или добавить в разделе "Информация" в настройках вашего проекта.
ШАГИ:
Добавьте в UIWindow подпредставление, которое будет использоваться в качестве фона строки состояния. Чтобы добиться этого, добавьте следующее в ваш AppDelegate's
application: didFinishLaunchingWithOptions:
послеmakeKeyAndVisible
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) { UIView *statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, yourAppsUIWindow.frame.size.width, 20)]; statusBarBackgroundView.backgroundColor = [UIColor blackColor]; [yourAppsUIWindow addSubview:statusBarBackgroundView]; }
Поскольку вы программно добавили фон ТОЛЬКО для iOS 7, вам придется соответствующим образом настроить макет элементов пользовательского интерфейса, которые перекрываются строкой состояния, сохраняя при этом их макет для iOS6. Для этого сделайте следующее:
- Убедиться, что
Use Autolayout
снят для вашей раскадровки (это потому, что в противном случае "iOS 6/7 Deltas" не отображается в Инспекторе размеров). Сделать это:- выберите файл раскадровки
- показать коммунальные услуги
- выберите "Показать инспектор файлов"
- Под "Документом Интерфейсного Разработчика" снимите флажок "Использовать Autolayout"
- При желании, чтобы помочь вам отслеживать изменения макета для iOS 7 и 6 по мере их применения, выберите "Помощник редактора", выберите "Предварительный просмотр" и "iOS 6.1 или более ранняя версия":
- Теперь выберите элемент пользовательского интерфейса, который вы хотите настроить, чтобы он больше не перекрывался строкой состояния.
- Выберите "Показать инспектор размера" в столбце "Утилиты".
- Переместите элемент UI вдоль оси Y на ту же величину, что и высота строки состояния bg:
- И измените значение iOS6 / 7 Deltas для Y на ту же ОТРИЦАТЕЛЬНУЮ величину, что и высота bg строки состояния (обратите внимание на изменение в предварительном просмотре iOS 6, если вы его используете):
- Убедиться, что
АЛЬТЕРНАТИВЫ:
Чтобы добавить еще меньше кода в проекты, насыщенные раскадровкой, и иметь автоматический фоновый режим строки состояния, вместо программного добавления фона для строки состояния, вы можете добавить цветное представление к каждому контроллеру представления, который находится в самом верху основного представления указанного viewcontroller. Затем вы изменили бы дельту высоты этого нового вида на ту же отрицательную величину, что и высота вашего вида (чтобы она исчезла в iOS 6).
Недостатком этой альтернативы (хотя, возможно, она и незначительна, учитывая совместимость с автоматическим поворотом) является тот факт, что этот дополнительный вид не сразу виден, если вы просматриваете раскадровку для iOS 6. Вы бы знали, что он есть, только если вы посмотрите на " Схема документа "Раскадровка.
Если вы не хотите, чтобы ваши контроллеры представления перекрывались строкой состояния (и панелями навигации), снимите флажок "Расширить края под верхними панелями" в Интерфейсном Разработчике в Xcode 5.
Apple выпустила Технический Q&A QA1797: Предотвращение того, чтобы строка состояния скрывала ваши взгляды. Он отлично работает для версий iOS 6 и iOS 7.
Я просмотрел много-много-много-много уроков, чтобы решить эту чертову проблему. Но ни один из них не работает! Вот мое решение, и оно работает для меня:
if( [[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f ) {
float statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
for( UIView *v in [self.view subviews] ) {
CGRect rect = v.frame;
rect.origin.y += statusBarHeight;
v.frame = rect;
}
}
Логика проста. Я перевожу все дочерние представления на self.view с 20 пикселями. Это все. Затем снимок экрана будет отображаться так же, как в iOS 6. Я ненавижу строку состояния iOS7! ~"~
Небольшая альтернатива ответу Арчи Холта, немного более простая:
а. Задавать UIViewControllerBasedStatusBarAppearance
в NO
в info.plist
б. В AppDelegate
"s application:didFinishLaunchingWithOptions:
, вызов:
if ([[UIDevice currentDevice].systemVersion floatValue] < 7)
{
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
else
{
// handling statusBar (iOS7)
application.statusBarStyle = UIStatusBarStyleLightContent;
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
self.window.clipsToBounds = YES;
// handling screen rotations for statusBar (iOS7)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}
И добавьте метод:
- (void)applicationDidChangeStatusBarOrientationNotification:(NSNotification *)notification
{
// handling statusBar (iOS7)
self.window.frame = [UIScreen mainScreen].applicationFrame;
}
Вы также можете рассмотреть подклассы UIWindow
обрабатывать UIApplicationDidChangeStatusBarOrientationNotification
сам.
Я использовал это во всех моих контроллерах представления, это просто. Добавьте эти строки во все ваши методы viewDidLoad:
- (void)viewDidLoad{
//add this 2 lines:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
[super viewDidLoad];
}
Попробуйте этот простой метод....
Шаг 1: Чтобы изменить в одиночном viewController
[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];
Шаг 2: изменить во всем приложении
info.plist
----> Status Bar Style
--->UIStatusBarStyle to UIStatusBarStyleBlackOpaque
Шаг 3: также добавьте это в каждый viewWillAppear
отрегулировать statusbar
высота для iOS7
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7) {
CGRect frame = [UIScreen mainScreen].bounds;
frame.origin.y+=20.0;
frame.size.height-= 20.0;
self.view.frame = frame;
[self.view layoutIfNeeded];
}
Я достиг строки состояния, как iOS 6 в iOS 7.
Установите для UIViewControllerBasedStatusBarAppearance значение NO в info.plist
Вставить этот код в - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
метод
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
[application setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.clipsToBounds =YES;
self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height);
//Added on 19th Sep 2013
NSLog(@"%f",self.window.frame.size.height);
self.window.bounds = CGRectMake(0,0, self.window.frame.size.width, self.window.frame.size.height);
}
Это может оттолкнуть все ваши просмотры на 20 пикселей. Чтобы прийти, используйте следующий код в -(void)viewDidAppear:(BOOL)animated
метод
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
CGRect frame=self.view.frame;
if (frame.size.height==[[NSUserDefaults standardUserDefaults] floatForKey:@"windowHeight"])
{
frame.size.height-=20;
}
self.view.frame=frame;
}
Вы должны установить значение windowHeight Userdefaults после выделения окна в методе didFinishLauncing, например:
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];
В Интерфейсном Разработчике есть опция, которая вызывает свойство iOS 6/7 Delta, которое направлено на решение проблемы смещения.
Взгляните на это в вопросе переполнения стека. Интерфейсный конструктор: для чего нужны UIView's Layout iOS 6/7 Delta?,
Моим решением было добавить UIView
с высотой 20 точек в верхней части окна на iOS 7. Затем я создал метод в своем классе AppDelegate, чтобы показать / скрыть "сплошной" фон строки состояния. В application:didFinishLaunchingWithOptions:
:
// ...
// Add a status bar background
self.statusBarBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 20.0f)];
self.statusBarBackground.backgroundColor = [UIColor blackColor];
self.statusBarBackground.alpha = 0.0;
self.statusBarBackground.userInteractionEnabled = NO;
self.statusBarBackground.layer.zPosition = 999; // Position its layer over all other views
[self.window addSubview:self.statusBarBackground];
// ...
return YES;
Затем я создал метод постепенного увеличения / уменьшения черного фона строки состояния:
- (void) showSolidStatusBar:(BOOL) solidStatusBar
{
[UIView animateWithDuration:0.3f animations:^{
if(solidStatusBar)
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
self.statusBarBackground.alpha = 1.0f;
}
else
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
self.statusBarBackground.alpha = 0.0f;
}
}];
}
Все, что мне нужно сделать, это позвонить [appDelegate showSolidStatusBar:YES]
при необходимости.
Это может быть огромной проблемой, если вы используете Auto layout, потому что вы больше не можете напрямую манипулировать кадрами. Есть простое решение без лишней работы.
В итоге я написал вспомогательный метод в Utility Class и вызвал его из всех контроллеров представления. viewDidLayoutSubviews
Метод.
+ (void)addStatusBarIfiOS7:(UIViewController *)vc
{
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
CGRect viewFrame = vc.view.frame;
if(viewFrame.origin.y == 20) {
//If the view's y origin is already 20 then don't move it down.
return;
}
viewFrame.origin.y+=20.0;
viewFrame.size.height-= 20.0;
vc.view.frame = viewFrame;
[vc.view layoutIfNeeded];
}
}
Переопределить ваш viewDidLayoutSubviews
метод в контроллере представления, где вы хотите строку состояния. Это поможет вам пережить бремя автопоставки.
- (void)viewDidLayoutSubviews
{
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
[super viewDidLayoutSubviews];
[MyUtilityClass addStatusBarIfiOS7:self];
}
Если вы используете конструктор интерфейса, попробуйте это:
В вашем XIB-файле:
1) Выберите основной вид, установите цвет фона на черный (или любой другой цвет, который вы хотите, чтобы строка состояния была
2) Убедитесь, что фон является автономным подпредставлением, расположенным как дочерний элемент верхнего уровня представления контроллера.
Переместите фон, чтобы стать прямым потомком зрения контроллера. Проверьте панель автоматического изменения размера, чтобы убедиться, что вы заблокировали все края рамки, активировали обе оси гибкости, и, если это UIImageView, установите режим содержимого на Масштаб для заполнения. Программно это преобразуется в contentMode, установленный в UIViewContentModeScaleToFill, и имеет его маску автоматического изменения размера (UIViewAutoresizingFurableWidth | UIViewAutoresizingF FlexibleHeight).
3) Теперь переместите все, что заблокировано, сверху вниз - на 20 пунктов и установите для iOS 6/7 delta Y значение -20.
Все дочерние элементы верхнего уровня, которые заблокированы в верхнем фрейме на панели автоматического изменения размера, должны быть перемещены вниз на 20 пунктов, и их дельта Y iOS 6/7 должна быть установлена на -20. (Cmd выберите все из них и нажмите стрелку вниз 20 раз - есть ли лучший способ для кого-либо?)
4) Отрегулируйте iOS 6/7 высоту дельты всех вышеупомянутых элементов, которые имели гибкую высоту. Любой из элементов, которые были заблокированы в верхней и нижней части рамы и для которых была включена гибкая высота на панели автоматического изменения размера, также должен иметь высоту iOS 6/7, установленную на 20. Это включает в себя фоновое представление, упомянутое выше. Это может показаться антиинтуитивным, но из-за порядка, в котором они применяются, это необходимо. Сначала задается высота кадра (в зависимости от устройства), затем применяются дельты, и, наконец, маски авторазмера применяются на основе позиций смещения всех дочерних кадров - подумайте немного, это будет иметь смысл.
5) Наконец, элементы, которые были привязаны к нижней рамке, но не к верхней рамке, вообще не нуждаются в дельтах.
Это даст вам одинаковую строку состояния в iOS7 и iOS6.
С другой стороны, если вы хотите стилизацию под iOS7 при сохранении совместимости с iOS6, то установите значения delta Y / delta height равными 0 для фона.
Чтобы увидеть больше информации о переходе на iOS7, прочитайте полный пост: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html
Как используя presentViewController:animated:completion:
испортил window.rootViewController.view
Мне пришлось найти другой подход к этому вопросу. Наконец-то я получил его для работы с модалами и вращениями, создав подкласс UIView моего rootViewController.
.час
@interface RootView : UIView
@end
.m
@implementation RootView
-(void)setFrame:(CGRect)frame
{
if (self.superview && self.superview != self.window)
{
frame = self.superview.bounds;
frame.origin.y += 20.f;
frame.size.height -= 20.f;
}
else
{
frame = [UIScreen mainScreen].applicationFrame;
}
[super setFrame:frame];
}
- (void)layoutSubviews
{
self.frame = self.frame;
[super layoutSubviews];
}
@end
Теперь у вас есть сильный обходной путь для анимации iOS7.
Я опаздываю на этот ответ, но я просто хочу поделиться тем, что я сделал, что в принципе является самым простым решением
Прежде всего -> Перейти к вашему info.plist
Файл и добавление строки состояния стиля-> Прозрачный черный стиль (альфа 0,5)
Теперь вот оно:
Добавьте этот код в свой AppDelegate.m
- (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;
}
Самый простой способ сделать это - установить старый SDK на свой новейший Xcode.
Как установить старый SDK на новейший Xcode?
Вы можете получить iOS 6.1 SDK с http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html или загрузить старый Xcode и получить SDK из его содержимого.
Разархивируйте и вставьте эту папку в /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
Перезапустите xcode.
- Теперь вы можете выбрать более старый SDK в настройках вашего проекта.
Надеюсь, это поможет вам. У меня это сработало =)
Чтобы продолжить работу с setStatusBarHidden: я использую эту категорию:
@interface UIApplication (StatusBar)
-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden;
@end
@implementation UIApplication (StatusBar)
-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden{
if (!IOS7) {
[self setStatusBarHidden:statusBarHidden];
return;
}
if ([self isStatusBarHidden] == statusBarHidden) {
return;
}
[self setStatusBarHidden:statusBarHidden];
[self keyWindow].clipsToBounds = YES;
CGFloat offset = statusBarHidden ? 0 : 20;
[self keyWindow].frame = CGRectMake(0,offset,[self keyWindow].frame.size.width,[self keyWindow].frame.size.height-offset);
[self keyWindow].bounds = CGRectMake(0, offset, [self keyWindow].frame.size.width,[self keyWindow].frame.size.height);
}
@end
Я нашел здесь лучшие альтернативы и решения для этой проблемы панели навигации в iOS7!
http://www.appcoda.com/customize-navigation-status-bar-ios-7/
Я надеюсь, что это очистит все наши вопросы и заботы.
Это может быть слишком поздно, чтобы поделиться, но у меня есть кое-что, что могло бы помочь кому-то, я пытался подразделить UINavigationBar и хотел сделать его похожим на ios 6 с черной строкой состояния и текстом строки состояния в белом.
Вот что я нашел для этого
self.navigationController?.navigationBar.clipsToBounds = true
self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor()
Это сделало мой фон строки состояния черным, текст строки состояния белым, а цвет панели навигации - белым.
iOS 9.3, XCode 7.3.1
Шаги для скрытия строки состояния в iOS 7:
1. Перейдите в файл приложения info.plist.
2.И установить, просмотреть внешний вид строки состояния контроллера: логическое НЕТ
Надеюсь, я решил проблему со статусной строкой.....
Вы можете скрыть строку состояния все вместе. Так что ваше приложение будет полноэкранным. Я думаю, что это лучшее, что вы получите.
UIStatusBarStyleNone
или установите в настройках цели.
Мое очень простое решение (при условии, что поддерживается только вертикальная ориентация) состоит в том, чтобы переопределить границы окна приложения для версий iOS ниже 7 в методе делегата приложения didFinishLaunchingWithOptions:
CGRect screenBounds = [[UIScreen mainScreen] bounds];
if ([HMService getIOSVersion] < 7) {
// handling statusBar (iOS6) by leaving top 20px for statusbar.
screenBounds.origin.y = 20;
self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
else {
self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}