我的解决方案很大程度上基于此处发布的其他解决方案,但由于我必须尝试许多不同的方法才能使其真正发挥作用,所以我将其发布。我的适用于带有 Swift 3.1 的 iOS 10,只有纵向模式的应用程序。(未在横向模式下测试)我的解决方案的目标是显示一个比呈现视图小的模式,这样我就可以在背景中看到呈现视图。
我必须在 Interface Builder 中正确配置 UIViewController,否则我的代码将无法正常工作。这是我的设置。我发现我的解决方案可以同时使用Cross Dissolve
和Cover Vertical
过渡样式。我认为 IB 中我的关键是Over Full Screen
演示文稿 - 它似乎不适用于此设置的其他一些值。
这是我想以模态方式呈现的 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
}
}