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

(Xcode6, iOS8, Swift, iPad)

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

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

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

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

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

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

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

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

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

введите описание изображения здесь

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

введите описание изображения здесь

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

  1. В раскадровке задан стиль modalPresentation для Over Current context

img1

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

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

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

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

для этого:

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

Вы можете попробовать этот код для 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) 

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

 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;)

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

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

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

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

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

  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) } 
  • Как «добавить существующие frameworks» в Xcode 4?
  • React Native / Xcode Upgrade и теперь RCTConvert.h не найден
  • Расстояние, перемещаемое акселерометром
  • Увеличить значок Push Push iPhone
  • Подавление устаревших предупреждений в Xcode
  • Отключить приглашение администратора сервера Mac OS X?
  • Ошибка Apple Mach-O Linker при компиляции для устройства
  • Как установить cocoapods?
  • как удалить subviews из scrollview?
  • Как обрабатывать дублируемую символьную ошибку от сторонних библиотек?
  • Как добавить JPEG в каталог активов в Xcode?
  • Давайте будем гением компьютера.