Мое решение в значительной степени основано на других решениях, размещенных здесь, но поскольку мне пришлось попробовать много разных вещей, чтобы заставить его работать, я публикую его. Моя предназначена для iOS 10 с Swift 3.1 только в портретном режиме. (Не тестировалось в ландшафтном режиме) Целью моего решения было отобразить модальное окно, которое было меньше, чем представление представления, и чтобы я мог видеть представление представления в фоновом режиме.
Мне пришлось правильно настроить UIViewController в Интерфейсном Разработчике, иначе мой код не работал бы. Вот мои настройки. Я нашел свое решение для работы со стилями перехода Cross Dissolve
и Cover Vertical
. Я думаю, что ключевым моментом для меня в IB был Over Full Screen
для презентации - похоже, он не работал с некоторыми другими значениями для этого параметра.
![Настройки IB](https://i.stack.imgur.com/Xmbre.png)
Вот код в UIViewController, который я хочу представить модально. Тогда я просто вызываю это, используя present(_:animated:completion:)
в другом месте. Кроме того, в VC, который я представлю модально, у меня есть логическое значение didLayout
, инициализированное как false
:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if !didLayout {
let width:CGFloat = self.view.bounds.width * 0.95 //modify this constant to change the amount of the screen occupied by the modal
let height:CGFloat = width * 1.618 //golden ratio
self.view.superview!.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.15) //slightly dim the background to focus on the modal
let screen = self.view.superview!.bounds
let frame = CGRect(x: 0, y: 0, width: width, height: height)
let x = (screen.size.width - frame.size.width) * 0.5
let y = (screen.size.height - frame.size.height) * 0.5
let mainFrame = CGRect(x: x, y: y, width: frame.size.width, height: frame.size.height)
self.view.frame = mainFrame
didLayout = true
}
}
person
Jacob F. Davis C-CISO
schedule
27.06.2017