如何使用Swift创建自定义类加载视图

3
我正在使用自定义类加载视图来实现加载概念。我需要通过简单的self.show()self.dismiss()函数来使用此自定义类。在这里,我通过在UIAlertView中使用UIActivityController来实现了这个概念,但我需要使用自定义类来完成这个操作。
以下是我使用UIActivityControllerUIAlertView中实现的代码。
func loadinHubShow() {
                let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert)
                let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
                loadingIndicator.hidesWhenStopped = true
                loadingIndicator.style = UIActivityIndicatorView.Style.gray
                loadingIndicator.startAnimating();
                alert.view.addSubview(loadingIndicator)
                present(alert, animated: true, completion: nil)
    }

func loadinHubDismiss() {
     dismiss(animated: false, completion: nil)
}

如何将此更改为自定义类 loading view。我不想在 UIAlertView 内使用 UIActivityController,而是需要通过 UIView 创建相同的外观和感觉 UI设计

请查看此链接:https://blog.usejournal.com/generic-loader-1858b093ac6b - Jitendra
3个回答

6
import Foundation
import UIKit

public class Indicator {

    public static let sharedInstance = Indicator()
    var blurImg = UIImageView()
    var indicator = UIActivityIndicatorView()

    private init()
    {
        blurImg.frame = UIScreen.main.bounds
        blurImg.backgroundColor = UIColor.black
        blurImg.isUserInteractionEnabled = true
        blurImg.alpha = 0.5
        indicator.style = .whiteLarge
        indicator.center = blurImg.center
        indicator.startAnimating()
        indicator.color = .red
    }

    func showIndicator(){
        DispatchQueue.main.async( execute: {

            UIApplication.shared.keyWindow?.addSubview(self.blurImg)
            UIApplication.shared.keyWindow?.addSubview(self.indicator)
        })
    }
    func hideIndicator(){

        DispatchQueue.main.async( execute:
            {
                self.blurImg.removeFromSuperview()
                self.indicator.removeFromSuperview()
        })
    }
}

如何从 MainViewController 调用此函数,同时 indicator.color = constants.appColor.kBlueColor 显示错误 Use of unresolved identifier 'constants'。它会像我上面提到的 Image UI 一样提供输出? - Test App
从您的视图控制器创建一个Indicator类的实例。调用showIndicator()方法。 - iOSDeveloper
从您的视图控制器中调用此函数: let activityInstance = Indicator() activityInstance.showIndicator() - iOSDeveloper
指示器.颜色 = //添加您选择的颜色,例如UIColor.red 您可以像这样使用:Indicator.sharedInstance.showIndicator() 要隐藏,请使用:Indicator.sharedInstance.hideIndicator() 包含在主线程中: DispatchQueue.main.async { Indicator.sharedInstance.showIndicator() } DispatchQueue.main.async { Indicator.sharedInstance.hideIndicator() } - Anil Kumar

1
import UIKit

class Loader: UIView {

var view: UIView!
@IBOutlet fileprivate weak var blurView: UIVisualEffectView!
@IBOutlet fileprivate weak var loader: UIActivityIndicatorView!

var targetView: UIView?

required init(forView view: UIView) {
    super.init(frame: view.bounds)
    targetView = view
    self._setup()
    targetView?.addSubview(self)
}
override init(frame: CGRect) {
    super.init(frame: frame)
    _setup()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self._setup()
}

private func _setup() {
    view = _loadViewFromNib()
    view.frame = bounds
    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.translatesAutoresizingMaskIntoConstraints = true

    addSubview(view)
}

private func _loadViewFromNib() -> UIView {
    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
    let nibView = nib.instantiate(withOwner: self, options: nil).first as! UIView

    return nibView
}

func showLoading(withCompletion completion: (() -> Swift.Void)? = nil) {
    UIView.animate(withDuration: 0.5, animations: { 
    }) { _ in
        completion?()
    }
}

func hideLoading() {
    UIView.animate(withDuration: 0.5, animations: {
    }) { _ in
        self.removeFromSuperview()
    }
}
}

您可以在您的ViewController中调用以下函数

func showLoading() {
    if self.view.subviews.map({ $0 is Loader }).contains(true) {
        return
    }
    let loader = Loader(forView: self.view)
    loader.showLoading()
}

func hideLoading() {
    for view in self.view.subviews {
        if let view = view as? Loader {
            view.hideLoading()
            break
        }
    }
}

如何从 MainViewController 调用此函数?它将提供像上面我提到的图像 UI 的输出? - Test App
如果我调用 self.showLoading() 会导致崩溃,错误信息为 'NSInternalInconsistencyException',原因:'无法加载 NIB - Test App
你需要创建一个带有上述 Swift 类的 XIB 文件,并将 UIActivityIndicatorView 输出口与上述类连接。 - Pal Singh Anand
1
这是您查询的非常简单的解决方案。您只需创建一个带有类和连接插座的xib文件即可。 - Pal Singh Anand
如果您不想使用上述解决方案,可以使用任何库。您可以使用下面的这个库。https://github.com/ninjaprox/NVActivityIndicatorView - Pal Singh Anand
显示剩余2条评论

0

您可以根据自己的需求自定义下面的代码

func showActivityIndicatory(uiView: UIView) {
    var container: UIView = UIView()
    container.frame = uiView.frame
    container.center = uiView.center
    container.backgroundColor = UIColorFromHex(0xffffff, alpha: 0.3)

    var loadingView: UIView = UIView()
    loadingView.frame = CGRectMake(0, 0, 80, 80)
    loadingView.center = uiView.center
    loadingView.backgroundColor = UIColorFromHex(0x444444, alpha: 0.7)
    loadingView.clipsToBounds = true
    loadingView.layer.cornerRadius = 10

    var actInd: UIActivityIndicatorView = UIActivityIndicatorView()
    actInd.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
    actInd.activityIndicatorViewStyle =
                UIActivityIndicatorViewStyle.WhiteLarge
    actInd.center = CGPointMake(loadingView.frame.size.width / 2,
                loadingView.frame.size.height / 2);
    loadingView.addSubview(actInd)
    container.addSubview(loadingView)
    uiView.addSubview(container)
    actInd.startAnimating()
}

你需要使用适合你设计的代码。先创建一个基础视图(容器),然后添加标签和活动监视器作为子视图。刚开始可能会感到困难,但一旦你了解如何使用UIView,就会变得容易。 - iOSDeveloper
在上面的代码中,加载视图包含活动指示器。容器视图具有加载视图和 actInd 作为子视图。只需添加一个 UILabel 并相应地定位即可。 - iOSDeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接