iOS 开发之路(使用WKWebView加载Html5) 四
基于Swift 3 、 Xcode 8 、 iOS 10 下的WKWebView的使用。
首先是WKWebView的基本用法:
var wk:WKWebView!
var progBar:UIProgressView! //定义的进度条
override func viewDidLoad() {
super.viewDidLoad()
self.wk = WKWebView(frame: self.view.frame)
let theConfiguration = WKWebViewConfiguration()
theConfiguration.userContentController = WKUserContentController() // 通过js与webview内容交互配置
let frame = CGRect(x: ,y : , width: self.view.frame.width, height:self.view.frame.height) //定位wk位置
wk = WKWebView(frame: frame, configuration: theConfiguration)
wk.allowsLinkPreview = true
self.wk.load(NSURLRequest(url:NSURL(string:"http://www.baidu.com/")! as URL) as URLRequest) //要在info.plist中添加对http的支持
self.view.addSubview(self.wk)
// add your self view here
// add back <- icon to back to previous page
}
上面的其实很简单,很多教程里其实都有。下面讲一下如何实现进度条。这个也不难。
//视图已经加载完后执行
override func viewDidAppear(_ animated: Bool){
super.viewDidAppear(animated) self.wk.uiDelegate = self //实现协议,进度条和获取网页标题需要用到
self.wk.navigationDelegate = self //网页间前进后退要用到 //生成进度条
progBar = UIProgressView(frame: CGRect(x: , y: , width: self.view.frame.width, height: ))
progBar.progress = 0.0
progBar.tintColor = UIColor.blue
self.view.addSubview(progBar)
//注册进度条监听事件
self.wk.addObserver(self, forKeyPath: "estimatedProgress", options: NSKeyValueObservingOptions.new, context: nil)
//注册网页标题监听事件
self.wk.addObserver(self, forKeyPath: "title", options: NSKeyValueObservingOptions.new, context: nil) }
上面的UIDelegate要在类前添加协议:
class LxxmForSwift: UIViewController, WKNavigationDelegate, WKUIDelegate, UINavigationControllerDelegate {
}
关于WKUIDelegate、UINavigationDelegate大家可以去Apple开发中心查看文档,保证会加深印象。
进度条、网页标题变动监听事件的具体实现:
//这里添加了estimatedProgrees和title两个监听事件
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "estimatedProgress" {
self.progBar.alpha = 1.0
progBar.setProgress(Float(wk.estimatedProgress), animated: true)
if(self.wk.estimatedProgress >= 1.0){
UIView.animate(withDuration: 0.3, delay: 0.1, options: UIViewAnimationOptions.curveEaseInOut, animations: { () -> Void in
self.progBar.alpha = 0.0
}, completion: { (finished:Bool) -> Void in
self.progBar.progress =
})
} } else if keyPath == "title" {
self.titleForWeb.title = self.wk.title //这里titleForWeb是我自己定义的一个导航bar
print(wk.title!)
}
}
注意,添加完的监听事件需要有对应的注销事件:
override func viewWillDisappear(_ animated: Bool) {
wk.removeObserver(self, forKeyPath: "estimatedProgress")
wk.removeObserver(self, forKeyPath: "title")
}
我们都知道,WKWebView比UIWebView占用更少内存,性能更好。不过UIWebView可以直接实现JS中alert实现,而前者对JS里的alert事件重新封装了,必须实现WKUIDelegate协议:
//把这两个方法加到代码里,配合之前的 self.wk.uiDelegate = self 即可。
//监听js调用提示框
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (action) in
completionHandler()
}))
self.present(alert, animated: true, completion: nil)
}
// 监听通过JS调用q确认框
func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (action) in
completionHandler(true)
}))
alert.addAction(UIAlertAction(title: "取消", style: .default, handler: { (action) in
completionHandler(false)
}))
self.present(alert, animated: true, completion: nil)
}
关于WKWebView中Html5图片上传,下一篇随笔我会说一下。
iOS 开发之路(使用WKWebView加载Html5) 四的更多相关文章
- iOS 开发之路(WKWebView内嵌HTML5之图片上传) 五
HTML5页面的图片上传功能在iOS端的实现. 首先,页面上用的是plupload组件,在wkwebview上存在两个坑需要修复才能正常使用. 问题:在webview上点击选择照片/相机拍摄,就会出现 ...
- iOS开发之控制器创建与加载(生命周期)
1.如何创建一个控制器 控制器常见的创建方式有以下几种: (1)通过storyboard创建 (2)直接创建 MJViewController *mj = [[MJViewController all ...
- iOS开发——网络Swift篇&NSURLSession加载数据、下载、上传文件
NSURLSession加载数据.下载.上传文件 NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的 ...
- iOS开发UI篇-懒加载、重写setter方法赋值
一.懒加载 1.懒加载定义 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再 ...
- IOS开发UI篇之──自定义加载等待框(MBProgressHUD)
本文转载至 http://blog.csdn.net/xunyn/article/details/8064984 原文地址http://www.189works.com/article-89289 ...
- ios开发之--MJRefresh上拉加载的时候,tableview会向上偏移
1,出现这种情况的原因: 这个应该是UITableView最大的改变.我们知道在iOS8引入Self-Sizing之后,我们可以通过实现estimatedRowHeight相关的属性来展示动态的内容, ...
- iOS中wkwebview加载本地html的要点
项目中有些页面,我采用了html页面开发,然后用wkwebview加载的设计.在加载过程中遇见了一些问题,在这里进行一些记载和讨论.如有不同意见欢迎进行评论沟通. 问题时候这样的: 在webview的 ...
- wkwebview加载本地html的要点
项目中有些页面,我采用了html页面开发,然后用wkwebview加载的设计.在加载过程中遇见了一些问题,在这里进行一些记载和讨论.如有不同意见欢迎进行评论沟通. 问题时候这样的: 在webview的 ...
- iOS之WKWebView加载的网页自适应大小
一,前言 有时候在WKWebView加载页面后会发现页面的字会很小, 这是因为原网页没有做手机屏幕尺寸的适配, 那么在后台不做调整的情况下我们移动端怎样来适配页面呢? 以下代码可以适配大小(原本不可以 ...
随机推荐
- 用redux构建购物车
很久没更新博客了,最近要用到react,再来跟大家分享一个redux案例吧. [ {"id": 1, "title": "iPad 4 Mini&qu ...
- ASP.NET Core 1.0到底是什么?
ASP.NET Core1.0 是微软的下一代ASP.NET框架.我们将ASP.NET升级到最新版本我们会发现最高级的版本是ASP.NET 4.6对应的FrameWork版本是4.6.1. 那么很多人 ...
- iOS学习笔记——iOS高级控件
UITableView UITableView的样式有两种,一种是Grouped(左图),另一种是Plain(右图),如下图,它的属性是style,类型为UITableViewStyle,枚举值分别是 ...
- Swift 自定义Subscript
Swift可以方便给自定义类加下标,其中参数和返回值可以在类里定义为任意类型: subscript(parameters) -> ReturnType { get { //return some ...
- 职责链模式(chain of responsibility)
一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...
- Scalaz(21)-类型例证:Liskov and Leibniz - type evidence
Leskov,Leibniz,别扭的名字,是什么地干活?碰巧从scalaz源代码里发现了这么个东西:scalaz/BindSyntax.scala /** Wraps a value `self` a ...
- 我的JavaScript笔记
JavaScript 一种基于对象(object)和事件驱动(Event Driven)的嵌入式脚本语言. 简单的例子 <html> <head> <title>D ...
- Mdrill 安装部署(单机版)
前期: -------------------------------------------------------- 准备: 1.centos6.5 /7 x86_64(后期会更改主机名称) 2. ...
- python 颜色定义
1.颜色定义说明格式:\033[显示方式;前景色;背景色m前景色 背景色 颜色---------------------------------------30 40 黑色31 41 红色32 42 ...
- 编译安装php-amq扩展
用途:这个扩展是用来操作rabbitmq服务端的 一.安装总括 1.编译安装librabbitmq库 这是一个开源c语言的库.用来与rabbitmq进行通信 而php的php-amqp扩展就是使用这个 ...