Подтвердить что ты не робот

Как представить модальный поверх текущего вида в Swift

(Xcode6, iOS8, Swift, iPad)

Я пытаюсь создать классический веб-образный вид, где внешняя часть диалогового окна "недоступна". Для этого я установил альфа-значение backgroundColor представления для модального значения 0,5, например:

self.view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)

Единственная проблема заключается в том, что когда модальный становится полноэкранным, представление представления удаляется. (Ref Прозрачный модальный вид на контроллере навигации).

(Немного раздражает концепция здесь. Почему удалить основной вид? Модальный по определению должен появляться поверх другого контента. После того как основное представление будет удалено, оно больше не модально. Оно где-то между модальным и толкательный переход. Wa wa wa... Во всяком случае..)

Чтобы этого не произошло, я установил modalPresentationStyle в CurrentContext в методе viewDidLoad родительского контроллера и в Storyboard... но не повезло.

    self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
    self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext

Как предотвратить удаление представления представления, когда модальный становится полноэкранным?

tyvm.. больше информации ниже.

Также в Storyboard, так же (представление: текущий контекст)

enter image description here

спасибо для вашей помощи... документация ниже:

enter image description here

4b9b3361

Ответ 1

Сначала удалите все явные настройки модального стиля презентации в коде и сделайте следующее:

  • В раскадровке установите стиль ModalViewController modalPresentation на Over Current context

img1

  1. Установите флажки в корневом/представлении ViewController - Provide Context и Define Context. Они, похоже, работают даже неконтролируемыми.

Ответ 2

Вы можете попробовать этот код для Swift

 let popup : PopupVC = self.storyboard?.instantiateViewControllerWithIdentifier("PopupVC") as! PopupVC
 let navigationController = UINavigationController(rootViewController: popup)
 navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
 self.presentViewController(navigationController, animated: true, completion: nil)

Для Swift 4 последний синтаксис с использованием расширения

extension UIViewController {
    func presentOnRoot('with' viewController : UIViewController){
        let navigationController = UINavigationController(rootViewController: viewController)
        navigationController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
        self.present(navigationController, animated: false, completion: nil)
    }
}

Как пользоваться

let popup : PopupVC = self.storyboard?.instantiateViewControllerWithIdentifier("PopupVC") as! PopupVC
self.presentOnRoot(with: popup)

Ответ 3

Единственная проблема, которую я вижу в вашем коде, заключается в том, что вы используете CurrentContext вместо OverCurrentContext.

Итак, замените это:

self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext

для этого:

self.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext

Ответ 4

Проблема с установкой modalPresentationStyle из кода заключалась в том, что вы должны были установить его в методе init() представленного контроллера представления, а не в контроллере родительского представления.

Из UIKit docs: "Определяет стиль перехода, который будет использоваться для этого контроллера вида, когда он представлен в виде модально.     это свойство на контроллере представления должно быть представлено, а не ведущий. По умолчанию     UIModalTransitionStyleCoverVertical".

Метод viewDidLoad будет вызываться только после того, как вы уже представили контроллер вида.

Вторая проблема заключалась в том, что вы должны использовать UIModalPresentationStyle.overCurrentContext.

Ответ 5

Единственный способ, которым я смог заставить это работать, состоял в том, чтобы сделать это на представительном контроллере представления:

    func didTapButton() {
    self.definesPresentationContext = true
    self.modalTransitionStyle = .crossDissolve
    let yourVC = self.storyboard?.instantiateViewController(withIdentifier: "YourViewController") as! YourViewController
    let navController = UINavigationController(rootViewController: yourVC)
    navController.modalPresentationStyle = .overCurrentContext
    navController.modalTransitionStyle = .crossDissolve
    self.present(navController, animated: true, completion: nil)
}

Ответ 6

Я обновляю простое решение. Сначала добавьте идентификатор к вашему сегменту, который представляет модальный. Затем в свойствах измените стиль презентации на "Over Current Context". Затем добавьте этот код при представлении контроллера представления (контроллер, представляющий модальный).

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let Device = UIDevice.currentDevice()

    let iosVersion = NSString(string: Device.systemVersion).doubleValue

    let iOS8 = iosVersion >= 8
    let iOS7 = iosVersion >= 7 && iosVersion < 8
    if((segue.identifier == "chatTable")){

    if (iOS8){


          }
        else {

            self.navigationController?.modalPresentationStyle = UIModalPresentationStyle.CurrentContext


        }
    }
}

Убедитесь, что вы изменили segue.identifier на свой собственный id;)

Ответ 7

Swift: Чтобы закрыть модальную попытку:

self.navigationController?.dismissViewControllerAnimated(true, completion: nil)

Ответ 8

Это работало для меня в Swift 5.0. Установите Storyboard Id в инспекторе идентичности как "destinationVC".

@IBAction func buttonTapped(_ sender: Any) {
    let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
    let destVC = storyboard.instantiateViewController(withIdentifier: "destinationVC") as! MyViewController

    destVC.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
    destVC.modalTransitionStyle = UIModalTransitionStyle.crossDissolve

    self.present(destVC, animated: true, completion: nil)
}