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

/**//swift中的get方法,可以直接varget或letget显示提示,如果使用的是get方法创建视图,调用添加到父类上的时候,要self._参数,如self._wkWebV,如此就可以看出来这个get方法的名称可以跟全局定义的参数名不一样,建议除了“_”不一样外,字母最好一样//letgetlet <#property name#>: <#type name#> = {<#statements#>return <#value#>}()//vargetvar <#variable name#>: <#type#> {<#statements#>}//vargetsetvar <#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 = selfif 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 = selfwkWebV.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.redloadingProgressV.progressTintColor = UIColor.greenreturn loadingProgressV}//MARK: ------ 创建刷新var _refreshContr: UIRefreshControl {refreshContr = UIRefreshControl.init()refreshContr.addTarget(self, action: #selector(webViewReload), for: .valueChanged)return refreshContr}//刷新方法func webViewReload() {webV.reload()wkWebV.reload()}//创建buttonvar _reloadBtn: UIButton {reloadBtn = UIButton.init(frame: CGRect.init(x: 0, y: 0, width: 150, height: 150))reloadBtn.center = self.view.centerreloadBtn.layer.cornerRadius = 75.0reloadBtn.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 = 0reloadBtn.titleLabel?.textAlignment = .centervar rect:CGRect = reloadBtn.framerect.origin.y -= 100reloadBtn.frame = rectreloadBtn.isEnabled = falsereturn reloadBtn}//MARK: ------ 导航按钮func createNaviItem() {self.showLeftBarBtnItem()self.showRightBarBtnItem()}//显示左barfunc showLeftBarBtnItem() {if webV.canGoBack || wkWebV.canGoBack {self.navigationItem.leftBarButtonItems = [self._backBarBtnItem,self._closeBarBtnItem]}else{self.navigationItem.leftBarButtonItem = self._backBarBtnItem}}//显示右barfunc showRightBarBtnItem() {//这里可以添加一个举报let rightBarBtn:UIBarButtonItem = UIBarButtonItem.init(title: "举报", style: .plain, target: self, action: #selector(rightBarClick))self.navigationItem.rightBarButtonItem = rightBarBtn}func rightBarClick() {print("点击了举报。。。。。。")}//创建返回barvar _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)}}//创建关闭barvar _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

Swift基础之封装一个WebViewController相关推荐

  1. Swift基础之封装蒙版指导视图

    相信大家都见到过,一个软件添加了新功能,会给用户使用步骤指导,所以我针对这个功能,便于使用的小demo,希望对大家有帮助. 源码中的注释比较详细,这里不再赘述,自行研究: var imageName: ...

  2. Swift基础语法: 25 - Swift的类和结构体

    在我们实际开发的过程中, 类和结构体是人们创建代码时所用的一种通用且灵活构造体, 为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法. 但是在 ...

  3. Swift基础 - - 高德地图实践

    高德地图开发需要自己到官网http://lbs.amap.com/console/ 注册一个ak,新建一个swift工程,然后在Info.plist中添加一个NSLocationAlwaysUsage ...

  4. Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire

    升级到 Swift3.0 之后,新版本的 Alamofire 只支持 iOS 9.0 以上的系统,如果要适配 iOS 8,需要自己封装 URLSession,下面是笔者的方案: 这里使用的是 Swif ...

  5. Swift基础之控制语句

    1. 步骤和基础1一样操作 2. 代码 1 // 2 // ViewController.swift 3 // SwiftLesson2 4 // 5 // Created by 薛雨仑 on 14- ...

  6. Swift基础--方法

    Swift基础--方法 swift中方法分为实例方法和静态方法,方法时于默写特定类型相关联的函数.类,结构体,枚举都可以定义实例方法,也可以定义静态方法. 一,实例方法 实例方法: 给特定类型实例封装 ...

  7. 从零开始学_JavaScript_系列(21)——dojo(8)(手把手教你封装一个widget)

    (73)封装一个widget 醒目:必须在web环境下使用,无论是python的web.py或者是通过http访问网站环境,都可以,但纯本地是不可行的. 首先,什么是widget? 简单来说,就是一个 ...

  8. 2个字符串相等 swift_Swift快速入门(一)之 Swift基础语法

    Swift快速入门(一)之 Swift基础语法 近期重新学习了一遍Swift语言,主要以<Swift编程权威指南(第2版)>为教程,学习过程中结合比对Java语言特性将学习心得作为三篇笔记 ...

  9. Swift基础——数组Array

    Swift基础--数组Array 数组:使用有序列表存储同一类型的多个值,相同值可出现在一个数组的不同位置. 数组简介 首先,和String一样我们也来看看他的一些Api方法 常规操作方法 rever ...

最新文章

  1. Series([] , [‘索引‘]) 数据字典 {‘项值 ’:键值}
  2. 有了Anaconda如何安装Pycharm以及简单使用和调试
  3. 上传代码到gitee操作
  4. good helper for your math homework: https://www.wolframalpha.com/
  5. 【图像超分辨率】Learning Texture Transformer Network for Image Super-Resolution
  6. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 18丨即时食物配送 II【难度中等】​
  7. 启动NameNode和DataNode
  8. java拼装树_java 数据拼装成树结构
  9. okhttp初识拦截器
  10. utilities(matlab)—— mat2imgcell
  11. Sass:基础用法学习笔记
  12. 布线问题_分支限界法
  13. 不确定中找到确定性, IBM开出哪些疫后企业数字化新处方?
  14. 触发onblur事件alert死循环问题
  15. 天堂2 mysql一闪而过_天堂2革命闪退怎么办_天堂2革命彻底解决游戏闪退方法_手心游戏...
  16. JS写一个简单的五星评价
  17. postgresql standard_conforming_strings参数
  18. c语言编程 人造卫星的高度,C语言实验教学教案2008
  19. 计算机属性安全选项卡,win10系统文件属性没有安全选项卡的图文办法
  20. 2021-12-5 《聪明的投资者》学习笔记

热门文章

  1. Hack The Box——Scavenger
  2. Vue项目中引进代码高亮插件——vue-highlightjs
  3. 【ASP.NET】System.Threading.ThreadAbortException中第一次偶然出现的“mscorlib.dll”类型的异常
  4. 《MongoDB极简教程》第一章 NoSQL简史 amp; MongoDB安装amp;环境配置
  5. mysql设置语言变量_Mysql语言之数据操作语言
  6. 远程桌面工具连接—远程桌面卡屏如何解决
  7. 电脑分盘怎么分?分盘详细教程来了,图文教学
  8. 复杂网络学习笔记:networkx实现网络的基本拓扑性质
  9. mysql my.cnf 不生效_MySQL修改my.cnf配置不生效的解决方法
  10. 69节入门python_Python爬虫合集:花6k学习爬虫,终于知道爬虫能干嘛了