首页 > 其他分享 >Swift基础之封装一个WebViewController

Swift基础之封装一个WebViewController

时间:2022-11-28 17:05:01浏览次数:72  
标签:封装 WebViewController self wkWebV loadingProgressV init var reloadBtn Swift


研究了一段时间,总算搞定了这个功能封装,现在给大家分享一下,具体看代码,上面有对应的文字描述,有问题请留言,下载源码,请帮忙点一下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)
}

效果图:

Swift基础之封装一个WebViewController_webview

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



标签:封装,WebViewController,self,wkWebV,loadingProgressV,init,var,reloadBtn,Swift
From: https://blog.51cto.com/u_15894905/5892251

相关文章

  • Swift基础之init方法,实例(对象)方法,类(静态)方法的使用(多标签Demo)
    Xcode更新过后,有些方法都进行了改变,Demo中有变化的都进行了简单的标记,具体以后遇见再说创建一个UIView类,用init方法创建两种类型,显示多标签,创建静态方法进行调用,创建类方法......
  • Swift基础之Delegate方法的使用
    本文简单介绍了使用Delegate方法的进行值的传递,改变上一个界面的字体大小和颜色首先创建一个导航视图:letviewC=ViewController();       letnavigationC=UIN......
  • Swift基础之对FMDB第三方的使用方法
    相信大家都熟悉OC使用FMDB第三方库,进行数据库操作,增、删、改、查,现在我就来利用代码展示一下Swift对此库的使用方法,我是通过Pods添加的第三方库,如果手动添加记得创建桥接文......
  • Swift基础之PickerView(时间)选择器
    代码讲解:(后面有额外代码讲解)首页设计UIPickerView的样式设计:leftArray=["花朵","颜色","形状"];              letarray1=["茉莉","玫瑰","郁金香"......
  • iOS开发之自己封装的提示框(警告框)样式BHAlertView
    最近需要使用到提示框(警告框)进行信息的展示和提醒,所以进行了一个类的封装,想用Swift调用此OC文件,但是发现有些困难,所以暂时先把OC代码进行展示,随后再好好研究一下在Swift中的......
  • Swift基础之仿资讯类实现频道的长按拖拽/删除/增加
    导读简单用Swift写了一个collectionview的拖拽点击排序效果;拖拽排序是新闻类的App可以说是必有的交互设计,如今日头条,网易新闻等。效果效果主要代码手势长按移动1.......
  • Swift基础之设计折线坐标图
    最近添加了折线视图的样式,所以在这里用Swift语言重新再使用设计一下首先设置纵坐标的数值是:体重//体重       letweightLabel=UILabel.init(frame:CGRectMake(0......
  • .Net Excel操作之NPOI(二)常用操作封装
    一、Excel数据导出常用操作1.指定表头和描述2.指定数据库中读出的数据集合二、ExcelExport封装///<summary>///Excel常用的表格导出逻辑封装///单表写入///</s......
  • Swift 周报 第十七期
    前言本期是Swift编辑组自主整理周报的第八期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋......
  • axios的封装
    新建network文件夹及request.js  importaxiosfrom'axios'exportfunctionrequest(config){//创建axios实例constinstance=axios.create({......