Я наконец нашел достойный способ сделать это. Вот пользовательский класс segue, который плавно выполняет переход.
StoryboardFadeToBlackSegue.swift
import UIKit
import Foundation
class StoryboardFadeToBlackSegue: UIStoryboardSegue {
override func perform() {
guard let window = (UIApplication.shared.delegate as? AppDelegate)?.window else {
super.perform()
return
}
let overlay = UIView(frame: window.frame)
overlay.layer.zPosition = 1
overlay.backgroundColor = .black
overlay.alpha = 0.0
window.addSubview(overlay)
UIView.animate(withDuration: 0.5, delay: 0, options: [.curveEaseOut], animations: {
overlay.alpha = 1.0
}, completion: { _ in
self.source.present(self.destination, animated: false, completion: {
UIView.animate(withDuration: 0.6, delay: 0, options: [.curveEaseIn], animations: {
overlay.alpha = 0.0
}, completion: { _ in
overlay.removeFromSuperview()
})
})
})
}
}
Чтобы использовать его, установите этот класс как связанный класс в инспекторе атрибутов для вашего Segue.