У меня был следующий код, который отлично работал в iOS7.
[UIView animateWithDuration:0.5 animations:^(void) {
self.view.alpha = 0.5;
[self.navigationController.navigationBar setAlpha:0.3];
}]; //to make the background view controller semi-transparent
UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
[rootViewController setModalPresentationStyle:UIModalPresentationCurrentContext];
OverlayViewController *ctlr = [storyBoard instantiateViewControllerWithIdentifier:@"OverlayViewController"];
//present the OverlayViewController
[self presentViewController:ctlr animated:YES completion:nil];
Тогда у меня было следующее в viewWillAppear контроллера фонового представления, чтобы вернуть его представление в полный непрозрачный.
[UIView animateWithDuration:1.0 animations:^(void) {
self.view.alpha = 1.0;
[self.navigationController.view setAlpha:1.0];
}];
Теперь, с iOS8, приведенный выше код не устанавливает, чтобы фон был полупрозрачным. Черный цвет окружает OverlayViewController.
Я нашел онлайн, что использование UIModalPresentationOverCurrentContext даст ожидаемое поведение. Это действительно так, но контроллер фонового представления никогда не снимается с иерархии представлений (отредактирован, чтобы добавить ссылку на это поведение: https://developer.apple.com/documentation/uikit/uimodalpresentationstyle). Таким образом, viewWillAppear никогда не вызывается, поэтому полупрозрачность никогда не удаляется.
Очевидно, что я могу прибегнуть к взломам, например, с помощью NSNotificationCenter и отключить уведомление при удалении OverlayViewController, но это похоже на окольный способ сделать то, что должно быть простым. Есть ли другой способ, которым я могу изящно достичь этого?
Сводные вопросы:
1) Если UIModalPresentationOverCurrentContext - единственный способ достичь этого, то мне интересно, будет ли я вынужден поставить две версии кода, чтобы заставить его работать как в iOS7, так и в iOS8.
2) Очевидно, что новое перечисление не распознается в более ранних версиях Xcode. Итак, если моя команда обновится до Xcode 6, чтобы убедиться, что они могут запускать этот код, даже если остальная часть их работы сосредоточена только на iOS7? Или есть способ сообщить старшей версии Xcode игнорировать конкретный блок кода, который нужен только для iOS8?