Swift基础之封装一个WebViewController

研究了一段时间,总算搞定了这个功能封装,现在给大家分享一下,具体看代码,上面有对应的文字描述,有问题请留言,下载源码,请帮忙点一下star,给点继续分享的动力,谢谢~

/**
     //swift中的get方法,可以直接varget或letget显示提示,如果使用的是get方法创建视图,调用添加到父类上的时候,要self._参数,如self._wkWebV,如此就可以看出来这个get方法的名称可以跟全局定义的参数名不一样,建议除了“_”不一样外,字母最好一样
     //letget
     let <#property name#>: <#type name#> = {
     <#statements#>
     return <#value#>
     }()
     //varget
     var <#variable name#>: <#type#> {
     <#statements#>
     }
     //vargetset
     var <#variable name#>: <#type#> {
     get {
     <#statements#>
     }
     set {
     <#variable name#> = newValue
     }
     }
     **/
    //MARK: ------ 创建webView,get方法
    var _webV: UIWebView {
        webV = UIWebView.init(frame:CGRect.init(x:0, y:Navi_Height, width:Screen_Width, height:Screen_Height-Navi_Height))
        webV.delegate = self
        
        if Device_System >= 10.0 && canDownRefresh {
            webV.scrollView.refreshControl = self._refreshContr
        }
        return webV
    }
    //MARK: ------ 创建WKWebView,get方法
    var _wkWebV: WKWebView {
        let configWkWeb:WKWebViewConfiguration = WKWebViewConfiguration.init()
        configWkWeb.preferences = WKPreferences.init()
        configWkWeb.userContentController = WKUserContentController.init()
        wkWebV = WKWebView.init(frame: CGRect.init(x: 0, y: Navi_Height, width: Screen_Width, height: Screen_Height-Navi_Height), configuration: configWkWeb)
        wkWebV.navigationDelegate = self
        wkWebV.uiDelegate = self
        //添加此属性可触发侧滑返回上一网页与下一网页操作
        wkWebV.allowsBackForwardNavigationGestures = true
        //下拉刷新
        if Device_System >= 10.0 && canDownRefresh {
            wkWebV.scrollView.refreshControl = self._refreshContr
        }
        //加载进度监听:观察wkwbview的estimatedProgress属性,从而调节进度条
        wkWebV.addObserver(self, forKeyPath: "estimatedProgress", options: [NSKeyValueObservingOptions.new], context: nil)
        
        return wkWebV
    }
    //MARK: ------ 观察者执行的方法
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        
        if keyPath == "estimatedProgress" {
            //取值时,这个地方跟OC中字典取值形式不一样,OC中的是change[@"new"]
            loadingProgressV.progress = change?[NSKeyValueChangeKey.newKey] as! Float
            //print(".......输出数值。。。\(loadingProgressV.progress)")
            if loadingProgressV.progress == 1.0 {
                DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double((Int64)(0.4 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: {
                    self.loadingProgressV.isHidden = true
                })
            }
        }
        //print("66666666")
    }
    //MARK: ------ 创建进度
    var _loadingProgressV: UIProgressView {
        loadingProgressV = UIProgressView.init(frame: CGRect.init(x: 0, y: Navi_Height, width: Screen_Width, height: 2))
//        //如果要添加背景色,需要设置 .bar 样式,然后设置背景色,否则只会默认灰色
//        loadingProgressV.progressViewStyle = .bar
//        loadingProgressV.backgroundColor = UIColor.red
        
        loadingProgressV.progressTintColor = UIColor.green
        return loadingProgressV
    }
    //MARK: ------ 创建刷新
    var _refreshContr: UIRefreshControl {
        refreshContr = UIRefreshControl.init()
        refreshContr.addTarget(self, action: #selector(webViewReload), for: .valueChanged)
        
        return refreshContr
    }
    //刷新方法
    func webViewReload() {
        webV.reload()
        wkWebV.reload()
    }
    //创建button
    var _reloadBtn: UIButton {
        reloadBtn = UIButton.init(frame: CGRect.init(x: 0, y: 0, width: 150, height: 150))
        reloadBtn.center = self.view.center
        reloadBtn.layer.cornerRadius = 75.0
        reloadBtn.setBackgroundImage(UIImage.init(named: "placeholder_error"), for: .normal)
        reloadBtn.setTitle("您的网络有问题,请检查您的网络设置", for: .normal)
        reloadBtn.setTitleColor(UIColor.lightGray, for: .normal)
        //跟OC调用不一样了
        reloadBtn.titleEdgeInsets = UIEdgeInsetsMake(200, -50, 0, -50)
        reloadBtn.titleLabel?.numberOfLines = 0
        reloadBtn.titleLabel?.textAlignment = .center
        var rect:CGRect = reloadBtn.frame
        rect.origin.y -= 100
        reloadBtn.frame = rect
        reloadBtn.isEnabled = false
        
        return reloadBtn
    }
    //MARK: ------ 导航按钮
    func createNaviItem() {
        self.showLeftBarBtnItem()
        self.showRightBarBtnItem()
    }
    //显示左bar
    func showLeftBarBtnItem() {
        if webV.canGoBack || wkWebV.canGoBack {
            self.navigationItem.leftBarButtonItems = [self._backBarBtnItem,self._closeBarBtnItem]
        }else{
            self.navigationItem.leftBarButtonItem = self._backBarBtnItem
        }
    }
    //显示右bar
    func showRightBarBtnItem() {
        //这里可以添加一个举报
        let rightBarBtn:UIBarButtonItem = UIBarButtonItem.init(title: "举报", style: .plain, target: self, action: #selector(rightBarClick))
        self.navigationItem.rightBarButtonItem = rightBarBtn
    }
    func rightBarClick() {
        print("点击了举报。。。。。。")
    }
    //创建返回bar
    var _backBarBtnItem: UIBarButtonItem {
        backBarBtnItem = UIBarButtonItem.init(title: "返回", style: .plain, target: self, action: #selector(backBarClick))
        
        return backBarBtnItem
    }
    func backBarClick() {
        if webV.canGoBack || wkWebV.canGoBack {
            webV.goBack()
            wkWebV.goBack()
        }else{
            self.navigationController?.popViewController(animated: true)
        }
    }
    //创建关闭bar
    var _closeBarBtnItem: UIBarButtonItem {
        closeBarBtnItem = UIBarButtonItem.init(title: "关闭", style: .plain, target: self, action: #selector(closeBarClick))
        
        return closeBarBtnItem
    }
    func closeBarClick() {
        self.navigationController?.popViewController(animated: true)
    }
效果图:


源码下载(下载源码,请帮忙点一下star,给点继续分享的动力,谢谢~):https://github.com/hbblzjy/SwiftWebControllerDemo



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hbblzjy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值