是否可以在 VNDocumentViewController 上放置加载动画?例如,当用户按下
Save
按钮时,有没有办法让我以某种方式指示 Vision
正在处理图像并且尚未冻结?现在,在我的应用程序中,用户按下“保存”和正在处理的实际图像之间有很长的停顿。这是我正在尝试创建的另一篇文章中的示例
这是使用 UIActivityIndicatorView() 添加加载指示器的一个示例。
startAnimating() 启动动画,stopAnimation() 停止动画。
guard let topWindow = UIApplication.shared.windows.last else {return}
let overlayView = UIView(frame: topWindow.bounds)
overlayView.backgroundColor = UIColor.clear
topWindow.addSubview(overlayView)
let hudView = UIActivityIndicatorView()
hudView.bounds = CGRect(x: 0, y: 0, width: 20, height: 20)
overlayView.addSubview(hudView)
hudView.center = overlayView.center
hudView.startAnimating()
或者,您可以考虑使用 Cocoapod MBProgressHud
有一种方法可以在 Swift 中扩展类来很好地解决这个问题。这个想法是你想要在你的 VNDocumentCameraViewController 中有一个 UIActivityIndicator。但我们希望它成为我们使用的每个版本的一部分。我们可以简单地将 DocumentVC 的视图嵌入到当前视图中,并在视图堆栈中将 UIActivityIndicator 叠加到其上方,但这非常麻烦。这是我们可以扩展任何类并解决这个问题的快速方法
import VisionKit
import UIKit
extension VNDocumentCameraViewController {
private struct LoadingContainer {
static var loadingIndicator = UIActivityIndicatorView()
}
var loadingIndicator: UIActivityIndicatorView {
return LoadingContainer.loadingIndicator
}
func animateLoadingIndicator() {
if loadingIndicator.superview == nil {
view.addSubview(loadingIndicator)
//Setup your constraints through your favorite method
//This constrains it to the very center of the controller
loadingIndicator.frame = CGRect(
x: view.frame.width / 2.0,
y: view.frame.height / 2.0,
width: 20,
height: 20)
//Setup additional state like color/etc here
loadingIndicator.color = .white
}
loadingIndicator.startAnimating()
}
func stopAnimatingLoadingIndicator() {
loadingIndicator.stopAnimating()
}
}
我们可以调用这些函数的地方是您在呈现的 ViewController 中实现的 VNDocumentCameraViewController 的委托方法:
func documentCameraViewController(
_ controller: VNDocumentCameraViewController,
didFinishWith scan: VNDocumentCameraScan
) {
controller.animateLoadingIndicator()
}