2013-09-19 2 views
10

Я построил свое приложение, чтобы иметь полупрозрачный навигатор в iOS 6. Я бы хотел использовать полупрозрачную панель состояния в iOS 7 и сохранить приложение как есть в iOS 6, но мой контент всегда находится под строкой состояния в iOS 7, а 20px отсутствует внизу. Я полагаю, что могу сделать очень утомительные изменения кода, которые проверяют, имеет ли устройство iOS 7, а затем соответствующим образом меняет контент, но я боюсь, что это будет большая работа.полупрозрачность состояния IOS 7 с обратной совместимостью

В идеале, я хотел бы добавить 20px отступа к началу зрения каждого контроллера представления, так что содержание сдвигается вниз, и до сих пор функционирует нормально с непрозрачным на навигационной панели прошивкой 6.

Я прочитайте темы, которые существуют по этому вопросу 12, но ни один из ответов не дал мне решения.

Следует отметить, что я НЕ использую Interface Builder, и все мои VC создаются программно.

+0

Эта ссылка интересная информация по этому вопросу: http://www.doubleencore.com/2013/09/developers-guide-to -the-ios-7-status-bar/ –

ответ

5

Вы можете использовать новую функцию Xcode 5 в дельтах iOS6/7 для установки -20 на все ваше представление, что даст вам аналогичный опыт. Правильно настройте свои представления для iOS7 в построителе интерфейса и используйте дельта для поддержки iOS6.

+0

Где xCode можно указать delta для iOS6? –

+0

Нашел его .. это не сработало для меня :-( –

+0

Мне приходилось упоминать дельта-х и дельта-высоту всех подзонов, а затем он работал для меня. –

5

Вот что я сделал, чтобы всегда вставлять верхнюю часть моего представления с 20px (высота строки состояния).

Я использовал этот код в приложении моего AppDelegate в: didFinishLaunchingWithOptions: метод

... 
// container holds my root view controller 
UINavigationController *container = [UINavigationController alloc] init...]; 
... 

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { // iOS 7 
    // Create parent controller that will contain your existing root view controller's view shifted 20 px down to account for the status bar. 
    UIViewController *newRootController = [[UIViewController alloc] init]; 

    // Add my old root view controller as a child 
    [newRootController addChildViewController:container]; 

    // Add its view as a subview 
    [newRootController.view addSubview:container.view]; 

    // Call this method because it does some configuration? 
    [container didMoveToParentViewController:newRootController]; 

    // Now just position the view starting at point (0, 20) 
    UIView *aView = container.view; 

    NSDictionary *viewDictionary = NSDictionaryOfVariableBindings(aView); 
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[aView]|" options:0 metrics:nil views:viewDictionary]; 

    [newRootController.view addConstraints:constraints]; 
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[aView]|" options:0 metrics:nil views:viewDictionary]; 

    [newRootController.view addConstraints:constraints]; 

    self.window.rootViewController = newRootController; 
} else { // pre iOS 7 
    self.window.rootViewController = container; 
} 

Теперь, когда вы в прошивке 7, все будет существовать, по мнению зрения контроллера корневого, который сдвинут на 20 пикселей вниз. Вам нужно будет сделать это только один раз в AppDelegate.

+0

Я пробовал это, и получаю исключение «Невозможно одновременно удовлетворить ограничения.« –

4

Set UIViewControllerBasedStatusBarAppearance' to NO in info.plist (To opt out of having view controllers adjust the status bar style so that we can set the status bar style by using the метод UIApplicationstatusBarStyle`)

В прикладных AppDelegate в:. DidFinishLaunchingWithOptions, звоните

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-20); 

    //Added on 19th Sep 2013 
    self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height); 
} 
return YES; 
+0

Не работает для меня при построении для iOS 6. Кроме того, стиль строки состояния не найден. – mhmdshawqi

+0

Это не для iOS 6. –

+0

Это не будет работать с поворотами устройства. –

2

Вы можете отключить вид идти под верхней панели в ИОС 7, установив следующее:

if([controller canPerformAction:@selector(setEdgesForExtendedLayout:) withSender:self]) { 
     [controller setEdgesForExtendedLayout:UIRectEdgeBottom | UIRectEdgeLeft | UIRectEdgeRight]; 
} 
+1

Это не сработало для меня , –

6

Если вы используете auto layout, тогда все, что вам нужно сделать, это добавить Vertical Constraint из вашей верхней части v iew до Top Layout Guide, как показано ниже, и он должен позаботиться о верхнем расстоянии.

enter image description here

Для получения дополнительной информации: https://developer.apple.com/library/ios/qa/qa1797/_index.html

Смежные вопросы