Прозрачность состояния IOS 7 с обратной совместимостью

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

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

Я прочитал темы, которые существуют по этому вопросу 1 2, но ни один из ответы предоставили мою проблему.

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

Ответ 1

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

enter image description here

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

Ответ 2

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

Ответ 3

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

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

...
// 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 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;
}

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

Ответ 4

Установите 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: doneFinishLaunchingWithOptions вызовите

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;

Ответ 5

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

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