gpt4 book ai didi

iOS Swift - 多个事件指示器(旋转器)出现在 web View 中

转载 作者:行者123 更新时间:2023-11-30 12:41:17 24 4
gpt4 key购买 nike

我正在基于 webView 的屏幕上工作,我希望在加载 Web 内容时有一个事件指示器旋转。

由于我必须在应用程序的另一个屏幕中使用相同的事件指示器,因此我将代码放在特定文件的静态函数中。

事件指示器似乎对于某些网络(简单)网页工作正常,但在加载更复杂的页面时遇到问题。 事件指示器多次重复。 (参见下面的屏幕截图)

在屏幕截图中,第一个事件指示器具有正确的布局,但下面的事件指示器较暗,这意味着其他几个事件指示器已相互重叠。 然后它们就永远不会消失。

说到代码:

我有一个 webView 和两个控制事件指示器的委托(delegate)方法。

func webViewDidStartLoad(_ webView: UIWebView) {

DispatchQueue.main.async {

EBUtil.startActivityIndicator(self)
}
}

func webViewDidFinishLoad(_ webView: UIWebView) {

DispatchQueue.main.async {

EBUtil.stopActivityIndicator(self)

}
}

我猜这是因为 webViewDidStartLoad 被多次调用。知道如何防止这种行为发生吗?

提前致谢。

爱德华

enter image description here

编辑:

这是我的 VC 的完整代码。

class NewsDetailsViewController: UIViewController, UIWebViewDelegate {

//MARK: - @IBOUTLETS

@IBOutlet weak var webView: UIWebView!

//MARK: - VARIABLES

var url: String!

//MARK: - APP LIFE CYCLE

override func viewDidLoad() {
super.viewDidLoad()

if url != nil {

let urlToLoad = NSURL(string: url)

webView.loadRequest(NSURLRequest(url: urlToLoad as! URL) as URLRequest)
}
}

func webViewDidStartLoad(_ webView: UIWebView) {

DispatchQueue.main.async {

EBUtil.startActivityIndicator(self)
}
}

func webViewDidFinishLoad(_ webView: UIWebView) {

DispatchQueue.main.async {

EBUtil.stopActivityIndicator(self)

}
}

}

以及事件指示器启动和停止的代码:

 static func startActivityIndicator(_ sender: UIViewController) {


print("START ANIMATING")

if let view = sender.view {

activityIndicatorBackground = UIView(frame: CGRect(x: view.center.x - 25, y: view.center.y - 25, width: 50, height: 50))
activityIndicatorBackground.backgroundColor = UIColor.black
activityIndicatorBackground.layer.zPosition = CGFloat(MAXFLOAT-1)
activityIndicatorBackground.alpha = 0.6
activityIndicatorBackground.layer.cornerRadius = 5

view.addSubview(activityIndicatorBackground)
activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
activityIndicator.center = view.center
activityIndicator.hidesWhenStopped = true
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.white
activityIndicator.layer.zPosition = CGFloat(MAXFLOAT)
view.addSubview(activityIndicator)
activityIndicator.startAnimating()
UIApplication.shared.beginIgnoringInteractionEvents()
}
}

static func stopActivityIndicator(_ sender: UIViewController) {
print("STOP ANIMATING")
activityIndicatorBackground.removeFromSuperview()
activityIndicator.stopAnimating()
UIApplication.shared.endIgnoringInteractionEvents()
}

最佳答案

试试这个 -

在 viewController 类中添加以下行 -

    var activityIndicator: UIActivityIndicatorView?

并更新您的 startActivityIndi​​cator stopActivityIndi​​cator 方法,如下所示 -

  func startActivityIndicator(_ sender: UIViewController) {

print("START ANIMATING")

if let view = sender.view {
if activityIndicator != nil {
activityIndicator?.removeFromSuperview()
}
activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
activityIndicator?.center = view.center
activityIndicator?.layer.cornerRadius = 10
activityIndicator?.backgroundColor = UIColor.gray
activityIndicator?.hidesWhenStopped = true
activityIndicator?.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.white
activityIndicator?.layer.zPosition = CGFloat(MAXFLOAT)
view.addSubview(activityIndicator!)
activityIndicator?.startAnimating()
UIApplication.shared.beginIgnoringInteractionEvents()
}
}


func stopActivityIndicator(_ sender: UIViewController) {
print("STOP ANIMATING")
activityIndicator?.stopAnimating()
activityIndicator?.removeFromSuperview()
UIApplication.shared.endIgnoringInteractionEvents()
}

希望它对你有用:)

关于iOS Swift - 多个事件指示器(旋转器)出现在 web View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42200387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com