带进度条的UIWebView

use*_*034 22 uiwebview uiprogressview ios

嗨,我是编程的新手,我正在尝试在Xcode上制作我的第一个iPhone应用程序.我的应用程序包含一个按钮,可在按下时打开UIWebView并加载主页.现在我还想在Safari也使用的WebView中添加一个Progress View,它表示加载页面的进度.我怎样才能做到这一点?
到目前为止,我的代码用于在UIWebView中加载URL:

.H

IBOutlet UIWebView *webView;
Run Code Online (Sandbox Code Playgroud)

.M

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

谢谢你的帮助!

Wol*_*ink 71

要准确UIProgressView,您需要执行以下任务:

  • 您可以在不完整的情况下获取信息
  • 根据该信息量化其"完整性"百分比.

现在当你装载你的时候,那是UIWebView不可能的.苹果公司也没有做到这一点.苹果经常使用假的UIProgressViews在页面加载时给你一些东西.Mail还使用虚假进度视图.去试试吧.这就是Apple的假进度视图的工作原理:

  • 进度视图开始以缓慢,恒定的速率移动
  • 如果任务在栏完成之前完成,它会突然在其余部分拉到100%然后消失
  • 如果任务需要很长时间,则进度视图将停止在95%并将保持在那里直到任务完成.

要实现此目的,您必须手动设置progressView的动画.你可以将它子类化,但这对你来说可能有点先进.最简单的方法是:

在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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

然后,在您的任务完成的位置,设置theBool = true;并且进度视图将自行处理.更改if语句中的值以控制动画的速度.

  • 我知道你正在隐藏进度条,但计时器应该还在运行吗?我们不应该也停止计时器吗? (3认同)
  • _ + 1_我在提交我之前没有正确阅读你的答案,这也建议假进度吧:) (2认同)

ZAF*_*007 5

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
    }
}
Run Code Online (Sandbox Code Playgroud)