Как удалить программно созданные UIViews из superview - PullRequest
2 голосов
/ 24 апреля 2019

Я хотел реализовать оверлей загрузки, пока у меня загрузка контента из вызова API, однако, когда я иду, чтобы закрыть представление; У меня нет успеха.

func viewLoading(show:Bool, boxView: UIView, error: Bool, errorMessage: String){
    let myNewView=UIView(frame: CGRect(x: 0, y: 0, width: boxView.frame.width, height: boxView.frame.height))

    if show{
        // Change UIView background colour
        myNewView.backgroundColor = UIColor.black.withAlphaComponent(0.75)
        myNewView.isOpaque = false
        // Add rounded corners to UIView
        myNewView.layer.cornerRadius = boxView.layer.cornerRadius

        let activityView = UIActivityIndicatorView(style: .whiteLarge)
        activityView.center = myNewView.center

        activityView.startAnimating()

        boxView.addSubview(myNewView)
        myNewView.addSubview(activityView)
    }else{
        print("Done")
        DispatchQueue.main.async(execute: { () -> Void in
            myNewView.removeFromSuperview()
            self.view.bringSubviewToFront(boxView)
        })
        myNewView.isHidden = true
    }
}

Ни один из вариантов после того, как остальное не сработало, и я потерялся в решении.

Редактировать: Я хочу, чтобы одна и та же функция (и) позволяла разместить три разных вида в одном контроллере вида.

Ответы [ 3 ]

0 голосов
/ 24 апреля 2019

Проверьте это ..

CommonMethods.swift

import UIKit

class CommonMethods: UIViewController {

static let actInd: UIActivityIndicatorView = UIActivityIndicatorView()
static let container: UIView = UIView()
static let loadingView: UIView = UIView()

static func showActivityIndicatory(uiView: UIView) {

        container.frame = uiView.frame
        container.center = uiView.center
        container.backgroundColor = UIColor(red:255/255, green:255/255, blue:255/255, alpha: 0.3)

        loadingView.frame = CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 80, height: 80))
        loadingView.center = uiView.center
        loadingView.backgroundColor = UIColor(red:44/255, green:44/255, blue:44/255, alpha: 0.7)
        loadingView.clipsToBounds = true
        loadingView.layer.cornerRadius = 10

        actInd.frame = CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 40, height: 40))
        actInd.style =
            UIActivityIndicatorView.Style.whiteLarge
        actInd.center = CGPoint(x: loadingView.frame.size.width / 2, y: loadingView.frame.size.height / 2);
        loadingView.addSubview(actInd)
        container.addSubview(loadingView)
        uiView.addSubview(container)
        actInd.startAnimating()
    }

static func hideActivityIndicatory(uiView: UIView) {
        container.removeFromSuperview()
        actInd.stopAnimating()
    }
}

вызовите его из класса viewcontroller, например

CommonMethods.showActivityIndicatory(uiView: self.view)
CommonMethods.hideActivityIndicatory(uiView: self.view)
0 голосов
/ 24 апреля 2019

Переместите myNewView за пределы области действия viewLoading, и лучше создать отдельные методы со своими обязанностями, например:

class ViewController: UIViewController {
    var loaderView: UIView?

    func showLoading(boxView: UIView, error: Bool, errorMessage: String) {
        if (self.loaderView != nil) {
            self.hideLoading()
        }

        let newView = UIView(frame: CGRect(x: 0, y: 0, width: boxView.frame.width, height: boxView.frame.height))
        newView.backgroundColor = UIColor.black.withAlphaComponent(0.75)
        newView.isOpaque = false
        // Add rounded corners to UIView
        newView.layer.cornerRadius = boxView.layer.cornerRadius

        let activityView = UIActivityIndicatorView(style: .whiteLarge)
        activityView.center = newView.center

        activityView.startAnimating()

        boxView.addSubview(newView)
        newView.addSubview(activityView)
        self.loaderView = newView
    }

    func hideLoading() {
        guard
            let loaderView = self.loaderView,
            let boxView = loaderView.superview
        else { return }

        DispatchQueue.main.async {
            loaderView.removeFromSuperview()
            self.view.bringSubviewToFront(boxView) // need this?
            self.loaderView = nil
        }
    }
}
0 голосов
/ 24 апреля 2019

Вы создаете новое представление каждый раз, когда вызывается этот метод, а затем пытаетесь отключить это вновь созданное представление. Вместо этого вам следует сохранить ссылку на представление при его отображении и вызвать removeFromSuperview для этого экземпляра, когда вам нужно его скрыть.

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