带有百分比的 UIProgressView 加载栏
UIProgressView loading bar with percentage
我想在 Swift 3 中为我的 iOS 项目制作一个加载栏。我目前正在做一个网络视图,需要做这个加载栏来显示在操作之间。我知道这是假的加载栏,我在 Objective-C 中看到了代码,并试图在 Swift 中用它做点什么,但恐怕我的逻辑是错误的,因为我是 [=] 中的新手24=].
我遇到的问题是我实际上不知道我是否将 vars theBool
和 timer
设置到正确的位置并且我不知道如何使用 Timer()
.
告诉你我在 运行 应用程序时看到的情况,进度条一直在显示,但没有加载。
到目前为止,这是我的代码
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var webView: UIWebView!
@IBOutlet weak var progressView: UIProgressView!
var theBool = false
var timer = Timer()
override func viewDidLoad() {
super.viewDidLoad()
progressView.progress = 0.0
//Reading the webview
let websiteURL = URL(string: "http://google.com")
let websiteURLRequest = URLRequest(url: websiteURL!)
webView.loadRequest(websiteURLRequest)
}
func webViewDidFinishLoad (){
if webView.isLoading == true {
theBool = true
}
}
func handleProgress () {
if (theBool){
if (progressView.progress >= 1) {
progressView.isHidden = true
timer.invalidate()
} else {
progressView.progress += 0.1
}
} else {
progressView.progress += 0.05
if (progressView.progress >= 0.95) {
progressView.progress = 0.95
}
}
}
/*
func addValsToProgress () ->String {
if (webViewLoading() == true) {
view.progressView.setProgre
}
}
*/
}
根据您提供的代码,您需要使用时间间隔和操作来初始化 timer
。这样,当调用计时器时,它会调用 handleProgress
。当加载状态开始时计时器应该 fire
并且会定期调用 handleProgress
直到加载完成。届时,计时器将为 invalidated
并将停止调用 handleProgress
。
请参阅 https://developer.apple.com/reference/foundation/timer 了解如何操作。
你不需要假的加载栏。你可以使用 WKWebView
KVO 观察员
您可以将 KVO 观察器设置为该值:
https://developer.apple.com/reference/webkit/wkwebview/1415007-estimatedprogress
YouTube 视频:https://www.youtube.com/watch?v=vd3Imcc7ctw
关于 github 搜索的更多示例:https://github.com/search?l=Swift&o=desc&q=estimatedProgress+addObserver&s=indexed&type=Code&utf8=%E2%9C%93
代表
WKNavigationDelegate
https://developer.apple.com/reference/webkit/wknavigationdelegate
这里还有一些委托回调:
optional func webView(_ webView: WKWebView,
didFinish navigation: WKNavigation!)
见https://developer.apple.com/reference/webkit/wknavigationdelegate/1455629-webview
PS: 还有WKUIDelegate——但是没有那么有趣的方法
所以在尝试了几次您发布的解决方案后,我找到了答案。
简单到让我汗颜
它就像一个魅力。谢谢大家的回答:)
@IBOutlet var webView: UIWebView!
@IBOutlet var progressView: UIProgressView!
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string: "http://google.com")
let request = NSURLRequest(url: url as! URL)
webView.loadRequest(request as URLRequest)
webView.delegate=self
}
func webViewDidStartLoad(_ webView: UIWebView) {
self.progressView.setProgress(0.1, animated: false)
}
func webViewDidFinishLoad(_ webView: UIWebView) {
self.progressView.setProgress(1.0, animated: true)
}
func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {
self.progressView.setProgress(1.0, animated: true)
}
我想在 Swift 3 中为我的 iOS 项目制作一个加载栏。我目前正在做一个网络视图,需要做这个加载栏来显示在操作之间。我知道这是假的加载栏,我在 Objective-C 中看到了代码,并试图在 Swift 中用它做点什么,但恐怕我的逻辑是错误的,因为我是 [=] 中的新手24=].
我遇到的问题是我实际上不知道我是否将 vars theBool
和 timer
设置到正确的位置并且我不知道如何使用 Timer()
.
告诉你我在 运行 应用程序时看到的情况,进度条一直在显示,但没有加载。
到目前为止,这是我的代码
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var webView: UIWebView!
@IBOutlet weak var progressView: UIProgressView!
var theBool = false
var timer = Timer()
override func viewDidLoad() {
super.viewDidLoad()
progressView.progress = 0.0
//Reading the webview
let websiteURL = URL(string: "http://google.com")
let websiteURLRequest = URLRequest(url: websiteURL!)
webView.loadRequest(websiteURLRequest)
}
func webViewDidFinishLoad (){
if webView.isLoading == true {
theBool = true
}
}
func handleProgress () {
if (theBool){
if (progressView.progress >= 1) {
progressView.isHidden = true
timer.invalidate()
} else {
progressView.progress += 0.1
}
} else {
progressView.progress += 0.05
if (progressView.progress >= 0.95) {
progressView.progress = 0.95
}
}
}
/*
func addValsToProgress () ->String {
if (webViewLoading() == true) {
view.progressView.setProgre
}
}
*/
}
根据您提供的代码,您需要使用时间间隔和操作来初始化 timer
。这样,当调用计时器时,它会调用 handleProgress
。当加载状态开始时计时器应该 fire
并且会定期调用 handleProgress
直到加载完成。届时,计时器将为 invalidated
并将停止调用 handleProgress
。
请参阅 https://developer.apple.com/reference/foundation/timer 了解如何操作。
你不需要假的加载栏。你可以使用 WKWebView
KVO 观察员
您可以将 KVO 观察器设置为该值:
https://developer.apple.com/reference/webkit/wkwebview/1415007-estimatedprogress
YouTube 视频:https://www.youtube.com/watch?v=vd3Imcc7ctw
关于 github 搜索的更多示例:https://github.com/search?l=Swift&o=desc&q=estimatedProgress+addObserver&s=indexed&type=Code&utf8=%E2%9C%93
代表
WKNavigationDelegate
https://developer.apple.com/reference/webkit/wknavigationdelegate
这里还有一些委托回调:
optional func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
见https://developer.apple.com/reference/webkit/wknavigationdelegate/1455629-webview
PS: 还有WKUIDelegate——但是没有那么有趣的方法
所以在尝试了几次您发布的解决方案后,我找到了答案。 简单到让我汗颜
它就像一个魅力。谢谢大家的回答:)
@IBOutlet var webView: UIWebView!
@IBOutlet var progressView: UIProgressView!
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string: "http://google.com")
let request = NSURLRequest(url: url as! URL)
webView.loadRequest(request as URLRequest)
webView.delegate=self
}
func webViewDidStartLoad(_ webView: UIWebView) {
self.progressView.setProgress(0.1, animated: false)
}
func webViewDidFinishLoad(_ webView: UIWebView) {
self.progressView.setProgress(1.0, animated: true)
}
func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {
self.progressView.setProgress(1.0, animated: true)
}