Отображение наложения между ViewControllers - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь отобразить представление наложения поверх каждого 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?
    })
}

Иерархия видов показана следующим образом. Вид наложения должен быть поверх всего.

Views hierarchy

1 Ответ

0 голосов
/ 16 мая 2018

Если вам необходимо отобразить загрузочный вид над всеми контроллерами, вы можете добавить его в окно.

if let window = UIApplication.shared.keyWindow {
    let overlay = OverlayLoadingView(frame:UIScreen.main.bounds)
    overlay.tag = 1001
    window.addSubView(overlay)
    // remove it like this
    window.viewWithTag(overlay.tag)?.removeFromSuperView()

}

Кстати, это не синглтон, так как я могу использовать init исоздайте другой экземпляр, отметьте init как частный.Завершите класс, чтобы избежать отражения, и замените class на static Поскольку класс может быть переопределен, но статический не может.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...