UIModalPresentationStyle.CurrentContext Swift iOS 7
Я хочу показать View - PresentedView
над другим представлением - Background View
с помощью iOS 7. В моем приложении я использую UITabBArController
, поэтому во время выполнения я не знаю, какой вид будет фоном (может быть любой из элементов панели вкладок). Ниже приведена структура:
UITabBarController
---> TabItem1 - FirstUIViewController
---> TabItem2 - SecondUIViewController
---> TabItem3 - ThirdUIViewController
Нужно что-то вроде этого:
![введите описание изображения здесь]()
Когда приложение загружается, я нахожусь на TabItem1 - FirstUIViewController
. Когда я нажимаю на TabItem3
, я хочу, чтобы ThirdUIViewController
отображался в верхней части на FirstUIViewController
, а "FirstUIViewController" должен появиться в фоновом режиме без взаимодействия с пользователем.
Что я сделал до сих пор:
-
Так как UIViewControllers
добавляются как Relationship Controllers
для отображения как TabBar Item
в `UITabBarController, я добавил segue из tabbarcontroller в ThridViewController.
-
Изменен PresentationStyle для этого Segue в UIModalPresentationStyle.CurrentContext и сделал ниже модификацию
func `viewDidLoad()` {
super.viewDidLoad()
self.performSegue("identifier", sender: self)
}
Ничего не происходит, и я просто вижу "ThridViewController" на белом фоне
-
Я пробовал подход к ручному кодированию:
func `viewDidLoad()` {
super.viewDidLoad()
let overlayController:UIThirdViewController = UIThirdViewController() //This controller has a view added on top of it, which covers top half screen only
overlayController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
self.presentViewController(overlayController, animated: true, completion: nil)
}
Без изменений. Новый вид переопределяет вид сверху. если я добавлю это overlayController.view.backgroundColor = UIColor.clearColor()
, я вижу половину экрана черного и половины, содержащий мой новый вид
Проблемные точки:
- Где я должен писать код для инициализации/вызова ThirdViewController для отображения поверх текущего представления?
- Как устранить проблему с черным экраном и заставить ее работать на iOS 7?
Я использую Xcode 7 и работаю на iOS7. Пожалуйста помоги. Будет оценен фрагмент рабочего кода. Не отправляйте сообщения о переполнении стека в качестве ответа, если только код не работает, и вы сами пробовали.
UPDATE:. При таком подходе я получаю черный экран
class TabBarViewController: UITabBarController, UITabBarControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
let switchController:UIViewController = SwitchViewController()
self.presentingViewController?.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
self.presentingViewController?.view.backgroundColor = UIColor.clearColor()
self.presentViewController(switchController, animated: true, completion: nil)
return false
}
}
Ответы
Ответ 1
Сделайте это настраиваемым контроллером просмотра контейнера (Apple Docs). Рабочий пример кода:
class MyTabVC: UITabBarController, UITabBarControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
presentThirdVC()
return false
}
func presentThirdVC() {
let myThirdVC = MyThirdVC.makeVC()
myThirdVC.view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.1)
addChildViewController(myThirdVC)
var newFrame = CGRectInset(view.bounds, 0, 50) // hack, do what you want
myThirdVC.view.frame = newFrame
view.addSubview(myThirdVC.view)
didMoveToParentViewController(myThirdVC)
}
}
class MyThirdVC: UIViewController {
class func makeVC() -> MyThirdVC {
return UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("myThirdVC") as! MyThirdVC
}
}
Скриншот:
![введите описание изображения здесь]()
Ответ 2
Вы должны подклассифицировать UITabBarController
и добавить его в пользовательский подкласс. Установите делегат UITabBarController
как self
, а затем, когда конкретный индекс будет использован, вместо того, чтобы позволить ему переключаться на вкладки, вы модно представляете меню. Методы UITabBarControllerDelegate
предоставят вам возможность сделать это.
В частности, используя этот метод делегата....
- tabBarController:shouldSelectViewController:
Вы можете представить меню, когда оно вызывается, для какой-либо вкладки и возврата НЕТ. Только вы пустой viewController для этой вкладки, так как он никогда не будет показан пользователю.
Для самого перехода я настоятельно рекомендую использовать подкласс UIPresentationController
, чтобы установить ракурсы просмотров контейнера немного меньше размера экрана и добавить "dimmingView". Это доступно только на iOS8, хотя, если вы хотите iOS7, вам нужно будет делать больше хакерских вещей.