Я пытаюсь отобразить представление наложения поверх каждого ViewController после успешного входа в систему, чтобы показать состояние загрузки приложения и загрузить некоторые данные во время отображения этого представления.
Это представление происходит из пользовательского файла NIB.
Я отображаю OverlayLoadingView после успешного запроса входа на сервер, затем хочу представить новый ViewController на другой раскадровке, используя:
self.present(vc, animated: true, completion: nil)
И, наконец, скрыть OverlayLoadingView в следующем ViewController (именно поэтому я воспринимаю его как Singleton).
Но когда я представляю следующий ViewController, OverlayLoadingView исчезает. Есть ли способ отобразить это представление загрузки поверх всего, одновременно представляя новый контроллер представления сзади?
Примерно так:
LoginViewController -> Успешно вошел в систему -> отобразить OverlayView -> представить MainViewController -> MainViewController, представленный ниже OverlayView -> Загрузить исходные данные -> Скрыть OverlayView после загрузки исходных данных.
@IBDesignable
public class OverlayLoadingView: UIView {
@IBOutlet weak var headerImageView: UIImageView!
@IBOutlet weak var detailTextLabel: UILabel!
class var sharedInstance: OverlayLoadingView {
struct Static {
static let instance: OverlayLoadingView = OverlayLoadingView(frame: UIScreen.main.bounds)
}
return Static.instance
}
// Custom view from the XIB file
fileprivate var view: UIView!
// Set header image directly by giving a value to headerImageURL variable from server response
/**
Initialiser method
*/
override init(frame: CGRect) {
super.init(frame: frame)
setupNib()
}
/**
Initialiser method
*/
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupNib()
}
fileprivate func loadNib() -> UIView? {
return Bundle.main.loadNibNamed("OverlayLoadingView", owner: self, options: nil)?.first as? UIView
}
func setupNib() {
if let overlayLoadingView = loadNib() {
self.view = overlayLoadingView
let screenWidth = Util.screenSize().width
let screenHeight = Util.screenSize().height
self.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight)
view.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight)
self.addSubview(view)
}
}
public func showOverlay() {
if let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let window = appDelegate.window {
self.alpha = 1.0
window.addSubview(self)
activityIndicator.startAnimating()
}
}
public func hideOverlayView() {
activityIndicator.stopAnimating()
self.removeFromSuperview()
}
}
EDIT:
Для отображения вида наложения я использую:
DispatchQueue.main.async {
let storyboard = UIStoryboard(name: "TabMenu", bundle: nil)
let vc = storyboard.instantiateInitialViewController()!
OverlayLoadingView.sharedInstance.showOverlay()
self.present(vc, animated: true, completion: {
// Dismiss current VC?
})
}
Иерархия видов показана следующим образом. Вид наложения должен быть поверх всего.