带进度条的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类参考后:
在讨论中你可以阅读:“你必须添加新的计时器到一个运行循环,使用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更多的技巧 ,但我认为,即使苹果在消息应用程序中使用此:)
- 当你开始加载页面时, 开始一个animation到90%的进度(比如1.5秒的时间,对于Wi-Fi,LTE,3G,也许是不同的)。
- 在页面加载的同时, 快速将进度设置为100% 。 完成!
- 如果页面需要更多时间加载,则进度条将停止在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的加载属性,以确定页面加载完成的时间。