带进度条的UIWebView

嗨,我是编程新手,我正在尝试在Xcode上为iPhone创build我的第一个应用程序。 我的应用程序包含一个button,按下后会打开一个UIWebView并加载一个主页。 现在我也想添加一个进度视图到Safari也使用的WebView,这表明加载页面的进度。 我怎样才能做到这一点?
我的代码到目前为止在UIWebView中加载URL:

。H

IBOutlet UIWebView *webView; 

.M

 - (void)viewDidLoad { [webView loadRequest:[NSURLRequest requestWithURL: [NSURL URLWithString:@"http:/www.google.com/"]]]; 

谢谢你的帮助!

要有一个准确的UIProgressView ,你需要有一些任务:

  • 当信息不完整时,您可以从中获取信息
  • 根据这些信息量化其“完整性”百分比。

现在,当你加载你的UIWebView ,这是不可能的。 而苹果也不这样做。 苹果经常使用假的UIProgressView来给你一些东西,看看页面加载时。 邮件也使用假进度视图。 去尝试一下自己。 这就是苹果的虚假进步观点的工作原理:

  • 进度视图开始以一个缓慢的,恒定的速度移动
  • 如果任务在小节完成之前完成,它会突然间在100%之前完全拉开,然后消失
  • 如果任务需要很长时间,则进度视图将停止在95%,并将一直保持到任务完成。

要做到这一点,你将不得不手动animationprogressView。 你可以inheritance它,但这可能会为你提前一点。 最简单的方法是这样的:

在myViewController.h中

 @interface myViewController : UIViewController { BOOL theBool; //IBOutlet means you can place the progressView in Interface Builder and connect it to your code IBOutlet UIProgressView* myProgressView; NSTimer *myTimer; } @end 

在myViewController.m

 #import "myViewController.h" @implementation myViewController - (void)webViewDidStartLoad:(UIWebView *)webView{ myProgressView.progress = 0; theBool = false; //0.01667 is roughly 1/60, so it will update at 60 FPS myTimer = [NSTimer scheduledTimerWithTimeInterval:0.01667 target:self selector:@selector(timerCallback) userInfo:nil repeats:YES]; } - (void)webViewDidFinishLoad:(UIWebView *)webView{ theBool = true; } -(void)timerCallback { if (theBool) { if (myProgressView.progress >= 1) { myProgressView.hidden = true; [myTimer invalidate]; } else { myProgressView.progress += 0.1; } } else { myProgressView.progress += 0.05; if (myProgressView.progress >= 0.95) { myProgressView.progress = 0.95; } } } @end 

然后,在你的任务完成的地方,设置theBool = true; 进度视图将自行处理。 更改if语句中的值来控制animation的速度。

Swift 2.2

 class ViewController: UIViewController,UIWebViewDelegate { @IBOutlet weak var webView: UIWebView! @IBOutlet weak var activityIndicator: UIActivityIndicatorView! @IBOutlet weak var myProgressView: UIProgressView! var myTimer = NSTimer() var theBool = Bool() override func viewDidLoad() { super.viewDidLoad() let url = NSURL(string: "https://www.youtube.com") let request = NSURLRequest(URL: url!) activityIndicator.hidesWhenStopped = true activityIndicator.startAnimating() webView.loadRequest(request) } func timerCallback(){ if theBool { if myProgressView.progress >= 1 { myProgressView.hidden = true myTimer.invalidate() }else{ myProgressView.progress += 0.1 } }else{ myProgressView.progress += 0.05 if myProgressView.progress >= 0.95 { myProgressView.progress = 0.95 } } } func webViewDidStartLoad(webView: UIWebView) { activityIndicator.startAnimating() myProgressView.progress = 0 theBool = false myTimer = NSTimer.scheduledTimerWithTimeInterval(0.01667,target: self,selector: #selector(ViewController.timerCallback),userInfo: nil,repeats: true) } func webViewDidFinishLoad(webView: UIWebView) { activityIndicator.stopAnimating() theBool = true } } 

我遵循Wolflink的答案,发现没有progressViewanimation的同样的问题。

阅读NSTimer类参考后:

https://developer.apple.com/library/Mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/clm/NSTimer/timerWithTimeInterval:target:selector:userInfo:重复 :

讨论中你可以阅读:“你必须添加新的计时器到一个运行循环,使用addTimer:forMode :.”

所以我补充说

[[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSDefaultRunLoopMode];

myTimer = [NSTimer timerWithTimeInterval:0.01667 target:self selector:@selector(timerCallback) userInfo:nil repeats:YES];

它为我工作(因为WolfLinkbuild议我做了UIProgressView的子类)

这很难(如果可能的话),因为你必须跟踪网站加载的所有资源,但…

我有一个想法。 这是一个比真正的解决scheme更多的技巧 ,但我认为,即使苹果在消息应用程序中使用此:)

  1. 当你开始加载页面时, 开始一个animation到90%的进度(比如1.5秒的时间,对于Wi-Fi,LTE,3G,也许是不同的)。
  2. 在页面加载的同时, 快速将进度设置为100% 。 完成!
  3. 如果页面需要更多时间加载,则进度条将停止在90%,并将在此处等待 。 用户在状态栏上观看慢速旋转指示器时的沮丧时刻! 然后最后,页面完成加载和(如在第2项),你玩快速animation到100% 。 完成!

我想我们都知道,这是消息应用程序的工作原理,因为我不相信发送短信可以跟踪这样准确的进展:)

如果有人想迅速做到这一点,我花了几天的时间试图弄清楚,最后做到了。

这是代码:)

 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) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } 

我会添加一个评论,而不是添加一个答案,但我还没有足够的声誉评论!

就在几天前,我几乎问完全相同的问题。 在这个问题中,我包含了我提出的解决scheme。 我的解决scheme比WolfLink更复杂,但它确实可以跟踪加载页面的真实进度,尽pipe它不是100%准确的。 正如WolfLink所说,这是不可能的。 我的问题可以在这里find: UIWebView的进度条

请注意,无论您如何操作,您都需要检查UIWebView的加载属性,以确定页面加载完成的时间。