美文网首页
Swift - 使用UIWebView和UIToolbar制作一

Swift - 使用UIWebView和UIToolbar制作一

作者: 小驴拉磨 | 来源:发表于2020-06-19 15:50 被阅读0次

(本文代码已升级至Swfit5)

使用网页控件(UIWebView)与工具栏控件(UIToolbar),我们可以自制一个小型的浏览器,其功能如下:
1、输入网址,点击“Go”按钮加载网页
2、加载过程中有进度条,同时可以点击停止按钮取消加载
3、有页面刷新按钮
4、有前进后退按钮


Simulator Screen Shot - iPhone SE (2nd generation) - 2020-06-19 at 15.40.35.png

工具条代码代码如下:

import UIKit
import WebKit

class BrowserToolBar: UIToolbar {
    
    var webViewClickAction:((_ actionType: Int) -> Void)? = {
        _ in
        return
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
 
    func setupUI()
    {
        //返回按钮
        let backBarItem = UIBarButtonItem(title: "返回", style: .plain, target: self, action: #selector(backBarItemAction))
        // 分割按钮
        let btngap1 = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
        // 前进按钮
        let forwardBack = UIBarButtonItem(title: "前进", style: .plain, target: self, action: #selector(forwardBackAction))
        // 分割按钮
        let btngap2 = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
        // 刷新按钮
        let updateBarItem = UIBarButtonItem(title: "刷新", style: .plain, target: self, action: #selector(updateBarItemAction))
        // 分割按钮
        let btngap3 = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
        // 停止按钮
        let stopBarItem = UIBarButtonItem(title: "停止", style: .plain, target: self, action: #selector(stopBarItemAction))
        // 分割按钮
        let btngap4 = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
        let progressBarItem = UIBarButtonItem(customView: progressView)
        
        self.setItems([backBarItem,btngap1,forwardBack,btngap2,updateBarItem,btngap3,stopBarItem,btngap4,progressBarItem], animated: true)
        
        ptimer.invalidate()
        
    }
    
    //进度条
    let progressView: UIProgressView = {
        let temp = UIProgressView(progressViewStyle: UIProgressView.Style.bar)
        temp.frame = CGRect(x: 0, y: 0, width: 80, height: 20)
        temp.progress = 0
        return temp;
    }()
    
    //进度条计时器
    let ptimer: Timer = {
        //创建计时器对象
        let ptimer = Timer.scheduledTimer(timeInterval: 0.2, target:self,
                                      selector: #selector(loadProgress),
                                      userInfo:nil,repeats:true)
        
        return ptimer
    }()
    
}

extension BrowserToolBar
{
    
     // 返回按钮
     @objc func backBarItemAction()
     {
         webViewClickAction?(0)
     }

     // 前进按钮
     @objc func forwardBackAction()
     {
         webViewClickAction?(1)
     }
     
     // 刷新按钮
     @objc func updateBarItemAction()
     {
         webViewClickAction?(2)
     }
     
     // 停止按钮
     @objc func stopBarItemAction()
     {
         webViewClickAction?(3)
     }
    
     // 定时器
     @objc func loadProgress()
     {
         // 如果进度满了,停止计时器
         if(progressView.progress >= 1.0)
         {
             // 停用计时器
             ptimer.invalidate();
         }
         else
         {
             // 改变进度条的进度值
             progressView.setProgress(progressView.progress + 0.02, animated:true);
         }
     }
     
}

控制器代码:

import UIKit
import WebKit

class BrowserViewController: UIViewController, UITextFieldDelegate, WKUIDelegate, WKNavigationDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // 设置UI
        setupUI()
    }
    
    /// 工具条
    private let toolBar: BrowserToolBar = {
        let toolBar = BrowserToolBar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 44))
        
        return toolBar;
    }()
    
    // url输入框
    private let urlTextField: UITextField = {
        let textField = UITextField(frame: CGRect(x: 0, y: 44, width: UIScreen.main.bounds.size.width - 44, height: 44))
        textField.backgroundColor = .white
        textField.borderStyle = .line
        return textField
    }()
    
    // 浏览按钮
    private let goButton: UIButton = {
        let button = UIButton(frame: CGRect(x: UIScreen.main.bounds.size.width - 44, y: 44, width: 44, height: 44))
        button.setTitle("GO", for: .normal)
        button.setTitleColor(.black, for: .normal)
        button.addTarget(self, action: #selector(goButtonAction), for: .touchUpInside)
        button.backgroundColor = .white
        return button
    }()
    
    // webview
    private let webView: WKWebView = {
        let webView = WKWebView(frame: CGRect(x: 0, y: 88, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - 88))
        
        return webView
    }()
    
    private let loadIndicator: UIActivityIndicatorView = {
        let loadIndicator = UIActivityIndicatorView(frame: CGRect(x: 120.0, y: 120.0, width: 32.0, height: 32.0))
        loadIndicator.style = UIActivityIndicatorView.Style.medium
        return loadIndicator;
    }()

}

extension BrowserViewController
{
    // 设置Ui
    func setupUI()
    {
        webView.uiDelegate = self
        webView.navigationDelegate = self
        urlTextField.delegate = self
        
        self.view.addSubview(toolBar)
        self.view.addSubview(urlTextField)
        self.view.addSubview(goButton)
        self.view.addSubview(webView)
        self.view.addSubview(loadIndicator)
        
        toolBar.webViewClickAction = {[weak self] actionType in
            print(actionType)
            switch actionType {
            case 0:
                self?.webView.goBack()
            case 1:
                self?.webView.goForward()
            case 2:
                self?.webView.reload()
            case 3:
                self?.webView.stopLoading()
            default:
                return
            }
            
        }
    }
    
    // 加载URL
    func loadUrl(_ url: String)
    {
        let urlobj = URL(string:url)
        let request = URLRequest(url:urlobj!)
        webView.load(request);
    }
    
    //跳转URL按钮
    @objc func goButtonAction()
    {
        urlTextField.resignFirstResponder()
        let url = urlTextField.text
        loadUrl(url!)
    }

}

// MARK: WKWebViewDelegate
extension BrowserViewController
{
    
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!)
    {
        toolBar.progressView.setProgress(0, animated:false);
        toolBar.ptimer.fire();
        loadIndicator.startAnimating();
    }
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
    {
        loadIndicator.stopAnimating();
        toolBar.progressView.setProgress(1, animated:true);
        toolBar.ptimer.invalidate();
    }
}

// MARK: UITextFieldDelegate
extension BrowserViewController
{
    func textFieldShouldReturn(_ textField:UITextField) -> Bool
    {
        urlTextField.resignFirstResponder()
        print("url Changed!")
        let url = urlTextField.text;
        loadUrl(url!)
        return true
    }
}

相关文章

网友评论

      本文标题:Swift - 使用UIWebView和UIToolbar制作一

      本文链接:https://www.haomeiwen.com/subject/uoiuxktx.html