UIModalPresentationStyle.CurrentContext Swift iOS 7
я хочу показать вид - 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 я добавил сегмент от tabbarcontroller к ThridViewController.-
изменен PresentationStyle для этого переходить на 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) }
никаких изменений. Новое представление переопределяет представление previos. если я добавлю это overlayController.view.backgroundColor = UIColor.clearColor()
, я вижу половину черного экрана и половину, содержащую мой новый вид
проблема Очки:
- где я должен написать код для инициализации / вызова ThirdViewController, чтобы появиться поверх текущего представления?
- как исправить проблему с черным экраном и заставить его работать на iOS 7?
я использую Xcode 7 и работаю на iOS7. Пожалуйста помочь. Будет оценен фрагмент рабочего кода. Не публикуйте другие сообщения переполнения стека в качестве ответа, если код не работает и вы не пробовали собственный.
обновление: - при таком подходе я получаю черный экран
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
}
}
2 ответов
сделайте его пользовательским контроллером представления контейнера (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
}
}
скриншоты:
вы должны подкласс UITabBarController
и добавьте его поведение в пользовательский подкласс. Установите UITabBarController
делегат в качестве self
а затем, когда конкретный индекс нажимается вместо того, чтобы позволить ему переключать вкладки, вы модально представляете меню. The UITabBarControllerDelegate
методы дадут вам шанс сделать это.
Specifcally используя этот метод делегата....
- tabBarController:shouldSelectViewController:
вы можете представить меню, когда это вызывается, для которого когда-либо вкладка и возврат нет. Просто вы пустой viewController для эта вкладка, так как она никогда не будет отображаться пользователю.
для самого перехода я настоятельно рекомендую использовать подкласс UIPresentationController
чтобы установить рамку представлений контейнера немного меньше размера экрана и добавить "dimmingView". Это доступно только на iOS8, хотя, если вы хотите iOS7, вам нужно будет сделать больше хакерских вещей.