为什么我的UIVisualEffectView在viewHierarchy中显示但不在我的设备中?

问题描述 投票:0回答:1

我面临一个难以理解的问题。

我有一个登录UIViewController和一个ProgressLoading UIVisualEffectView。我想在进行API调用并等待响应时打印加载。这是myProgressLoading类

import UIKit

class ProgressLoading: UIVisualEffectView {

    var text: String? {
        didSet {
            label.text = text
        }
    }

    let activityIndictor: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
    let label: UILabel = UILabel()
    let blurEffect = UIBlurEffect(style: .light)
    let vibrancyView: UIVisualEffectView

    init(text: String) {
        self.text = text
        self.vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect))
        self.vibrancyView.backgroundColor = UIColor(white: 0.2, alpha: 0.7)
        super.init(effect: blurEffect)
        self.setup()
    }

    required init?(coder aDecoder: NSCoder) {
        self.text = ""
        self.vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect))
        self.vibrancyView.backgroundColor = UIColor(white: 0.2, alpha: 0.7)
        super.init(coder: aDecoder)
        self.setup()
    }


    func setup() {

        contentView.addSubview(vibrancyView)
        contentView.addSubview(activityIndictor)
        contentView.addSubview(label)
        activityIndictor.startAnimating()
    }

    override func didMoveToSuperview() {
        super.didMoveToSuperview()

        if let superview = self.superview {

            let width = superview.frame.size.width / 2.3
            let height: CGFloat = 50.0
            self.frame = CGRect(x: superview.frame.size.width / 2 - width / 2,
                                y: superview.frame.height / 2 - height / 2,
                                width: width,
                                height: height)
            vibrancyView.frame = self.bounds

            let activityIndicatorSize: CGFloat = 40
            activityIndictor.frame = CGRect(x: 5,
                                            y: height / 2 - activityIndicatorSize / 2,
                                            width: activityIndicatorSize,
                                            height: activityIndicatorSize)
            activityIndictor.color = UIColor.white

            layer.cornerRadius = 8.0
            layer.masksToBounds = true
            label.text = text
            label.textAlignment = NSTextAlignment.center
            label.frame = CGRect(x: activityIndicatorSize + 5,
                                 y: 0,
                                 width: width - activityIndicatorSize - 15,
                                 height: height)
            label.textColor = UIColor.white
            label.font = UIFont.boldSystemFont(ofSize: 16)
        }
    }

    func show() {
        self.isHidden = false
    }

    func hide() {
        self.isHidden = true
    }
}

以下是我如何使用我的进度加载,显示和隐藏方法并使用文本声明。

override func viewDidLoad() {
    super.viewDidLoad()

    progressLoading = ProgressLoading(text: "Loggin in...")
    progressLoading?.hide()
    self.view.addSubview(progressLoading!)
}



func startAnimatingLoading(viewModel: Login.ViewModel) {
    self.progressLoading?.show()
}

func stopAnimatingLoading(viewModel: Login.ViewModel) {
    self.progressLoading?.hide()
}

我的问题是,当我等待响应时,我以编程方式显示加载,但我的设备中没有任何内容。 (如果你想知道,我通过创建断点并保持断点来模拟长API回调)

我查看了视图层次结构,并且正在加载就在我所要求的所有内容之前。

这是我的视图层次结构:

是否有一些我没有得到viewHierarchy?如何在视图层次结构上显示某些内容但不在我的设备中显示?

谢谢你的帮助,我只是不明白!

ios swift
1个回答
0
投票

你是在主线程上进行API调用吗?如果启动动画然后阻止主线程,则不会出现进度指示器 - 系统至少需要一个绘制周期才能实际显示指示器。将模拟的API调用移动到后台线程,然后在调用之前显示指示符,并在API响应时隐藏它。希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.