iOS 8 WkWebView 网页的配置和前进,后退,js 交互和进度条的加载
来源:互联网 发布:淘宝怎么换购产品 编辑:程序博客网 时间:2024/05/16 19:56
本文也将讲解到WebKit中更新的WKWebView控件的新特性与使用方法,它很好的解决了UIWebView存在的内存、加载速度等诸多问题。
一、WKWebView新特性
- 在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存,模拟器加载百度与开源中国网站时,WKWebView占用23M,而UIWebView占用85M);
- 允许JavaScript的Nitro库加载并使用(UIWebView中限制);
- 支持了更多的HTML5特性;
- 高达60fps的滚动刷新率以及内置手势;
- 将UIWebViewDelegate与UIWebView重构成了14类与3个协议;
// Created by 周双建 on 15/12/21.
// Copyright © 2015年周双建. All rights reserved.
//
#import "ViewController.h"
//要导入其框架
#import <WebKit/WKWebView.h>
#import <WebKit/WebKit.h>
typedef enum {
URL_load = 0,
HTML_load ,
Data_load ,
Fiel_load,
}WkwebLoadType;
@interface ViewController ()<WKNavigationDelegate,WKUIDelegate>
//创建一个实体变量
@property(nonatomic,strong)WKWebView * ZSJ_WkwebView;
// 加载type
@property(nonatomic,assign)NSInteger IntegerType;
// 设置加载进度条
@property(nonatomic,strong)UIProgressView * ProgressView;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
[self makeNav];
// 创建进度条
if (!self.ProgressView) {
self.ProgressView = [[UIProgressViewalloc]initWithProgressViewStyle:UIProgressViewStyleDefault];
self.ProgressView.frame =CGRectMake(0,64, self.view.bounds.size.width,1);
// 设置进度条的色彩
[self.ProgressViewsetTrackTintColor:[UIColorclearColor]];
self.ProgressView.progressTintColor = [UIColormagentaColor];
[self.viewaddSubview:self.ProgressView];
}
//初始化webview
if (!self.ZSJ_WkwebView) {
//设置网页的配置文件
WKWebViewConfiguration * Configuration = [[WKWebViewConfigurationalloc]init];
//允许视频播放
Configuration.allowsAirPlayForMediaPlayback =YES;
// 允许在线播放
Configuration.allowsInlineMediaPlayback =YES;
// 允许可以与网页交互,选择视图
Configuration.selectionGranularity = YES;
//创建更改数据源
NSString * JS = [NSStringstringWithFormat:@"loadDetail(\"%d\")",70];
WKUserScript * script = [[WKUserScriptalloc] initWithSource:JSinjectionTime:WKUserScriptInjectionTimeAtDocumentEndforMainFrameOnly:YES];
WKUserContentController * UserContentController = [[WKUserContentControlleralloc]init];
[UserContentController addUserScript:script];
// 是否支持记忆读取
Configuration.suppressesIncrementalRendering =YES;
// 允许用户更改网页的设置
Configuration.userContentController = UserContentController;
self.ZSJ_WkwebView = [[WKWebViewalloc]initWithFrame:CGRectMake(0,66, self.view.bounds.size.width,self.view.bounds.size.height -111)configuration:Configuration];
// 设置代理
self.ZSJ_WkwebView.navigationDelegate =self;
self.ZSJ_WkwebView.UIDelegate =self;
// 添加进度监控
/*
NSKeyValueObservingOptionNew 把更改之前的值提供给处理方法
NSKeyValueObservingOptionOld把更改之后的值提供给处理方法
NSKeyValueObservingOptionInitial把初始化的值提供给处理方法,一旦注册,立马就会调用一次。通常它会带有新值,而不会带有旧值。
NSKeyValueObservingOptionPrior分2次调用。在值改变之前和值改变之后。
*/
[self.ZSJ_WkwebViewaddObserver:selfforKeyPath:@"estimatedProgress"options:NSKeyValueObservingOptionNewcontext:nil];
//开启手势触摸
self.ZSJ_WkwebView.allowsBackForwardNavigationGestures = YES;
// 设置 可以前进和 后退
//适应你设定的尺寸
[self.ZSJ_WkwebViewsizeToFit];
//选择加载方式
[selfloadinteger:HTML_load];
//添加到主控制器上
[self.viewaddSubview:self.ZSJ_WkwebView];
[self makefourbtn];
}
// Do any additional setup after loading the view, typically from a nib.
}
-(void)makeNav{
UILabel * Nav_Label = [[UILabelalloc]initWithFrame:CGRectMake(self.view.center.x-100,20, 200, 44)];
Nav_Label.text = @"成功QQ吧提供";
Nav_Label.textAlignment =NSTextAlignmentCenter;
Nav_Label.font = [UIFontitalicSystemFontOfSize:22];
[self.viewaddSubview:Nav_Label];
UIView * Line = [[UIViewalloc]initWithFrame:CGRectMake(0,63.5, self.view.bounds.size.width,0.5)];
Line.backgroundColor = [UIColorlightGrayColor];
[self.viewaddSubview:Line];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
});
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)makefourbtn{
NSArray * WkWeb_Title = @[@"重载",@"后退",@"前进",@"跳转"];
for (int i=0 ; i<4; i ++) {
UIButton * button = [UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame =CGRectMake(10+i*((self.view.bounds.size.width-50)/4+10),self.view.bounds.size.height -45, (self.view.bounds.size.width-50)/4,40);
[button setTitle:WkWeb_Title[i]forState:UIControlStateNormal];
button.layer.borderWidth =0.5;
[button setTitleColor:[UIColorblackColor] forState:UIControlStateNormal];
button.tag = i;
[button addTarget:selfaction:@selector(ClicK:)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:button];
}
}
-(void)ClicK:(UIButton *)Btn{
switch (Btn.tag) {
case 0:{
// //这个是带缓存的验证
// [self.ZSJ_WkwebView reloadFromOrigin];
// 是不带缓存的验证,刷新当前页面
[self.ZSJ_WkwebViewreload];
}
break;
case 1:{
// 后退
// 首先判断网页是否可以后退
if (self.ZSJ_WkwebView.canGoBack) {
[self.ZSJ_WkwebViewgoBack];
}
}
break;
case 2:{
// 前进
// 判断是否可以前进
if (self.ZSJ_WkwebView.canGoForward) {
[self.ZSJ_WkwebViewgoForward];
}
}
break;
case 3:{
//进行跳转,我们设置跳转的返回到第一个界面
NSLog(@"%@",self.ZSJ_WkwebView.backForwardList.backList);
if (self.ZSJ_WkwebView.backForwardList.backList.count >2) {
[self.ZSJ_WkwebViewgoToBackForwardListItem:self.ZSJ_WkwebView.backForwardList.backList[0]];
}
}
break;
default:
break;
}
}
-(void)loadinteger:(NSInteger)integer{
switch (integer) {
case 0:{
//创建一个NSURLRequest的对象
NSURLRequest * Request_zsj = [NSURLRequestrequestWithURL:[NSURLURLWithString:@"http://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gbk&word=%C3%C0%C5%AE%CD%BC%C6%AC%B4%F3%CD%BC&fr=ala&ala=1&alatpl=cover&pos=0#z=0&pn=&ic=0&st=-1&face=0&s=0&lm=-1"]];
//加载网页
[self.ZSJ_WkwebViewloadRequest:Request_zsj];
}
break;
case 1:{
// 获取文件路径
NSString *resourcePath = [ [NSBundlemainBundle] resourcePath];
NSString *filePath = [resourcePathstringByAppendingPathComponent:@"test.html"];
NSString *htmlstring =[[NSStringalloc] initWithContentsOfFile:filePathencoding:NSUTF8StringEncodingerror:nil];
[self.ZSJ_WkwebViewloadHTMLString:htmlstring baseURL:[NSURLURLWithString:[[NSBundlemainBundle] bundlePath]]];
}
break;
case 2:{
}
break;
case 3:{
}
break;
default:
break;
}
}
//这个是网页加载完成,导航的变化
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
/*
主意:这个方法是当网页的内容全部显示(网页内的所有图片必须都正常显示)的时候调用(不是出现的时候就调用),,否则不显示,或则部分显示时这个方法就不调用。
*/
NSLog(@"加载完成调用");
// 获取加载网页的标题
NSLog(@"加载的标题:%@",self.ZSJ_WkwebView.title);
}
//开始加载
-(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{
//开始加载的时候,让加载进度条显示
self.ProgressView.hidden =NO;
NSLog(@"开始加载的时候调用。。");
NSLog(@"%lf", self.ZSJ_WkwebView.estimatedProgress);
}
//内容返回时调用
-(void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{
NSLog(@"当内容返回的时候调用");
NSLog(@"%lf", self.ZSJ_WkwebView.estimatedProgress);
}
-(void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation{
NSLog(@"这是服务器请求跳转的时候调用");
}
-(void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error{
// 内容加载失败时候调用
NSLog(@"这是加载失败时候调用");
NSLog(@"%@",error);
}
-(void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error{
NSLog(@"通过导航跳转失败的时候调用");
}
-(void)webViewDidClose:(WKWebView *)webView{
NSLog(@"网页关闭的时候调用");
}
-(void)webViewWebContentProcessDidTerminate:(WKWebView *)webView{
NSLog(@"%lf", webView.estimatedProgress);
}
-(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
// 获取js 里面的提示
}
-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{
// js 信息的交流
}
-(void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *_Nullable))completionHandler{
// 交互。可输入的文本。
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
// 首先,判断是哪个路径
if ([keyPath isEqualToString:@"estimatedProgress"]) {
// 判断是哪个对象
if (object == self.ZSJ_WkwebView) {
NSLog(@"进度信息:%lf",self.ZSJ_WkwebView.estimatedProgress);
if (self.ZSJ_WkwebView.estimatedProgress ==1.0) {
//隐藏
self.ProgressView.hidden =YES;
}else{
// 添加进度数值
self.ProgressView.progress =self.ZSJ_WkwebView.estimatedProgress;
}
}
}
}
//注意,观察的移除
-(void)dealloc{
[selfremoveObserver:selfforKeyPath:@"estimatedProgress"];
}
@end
- iOS 8 WkWebView 网页的配置和前进,后退,js 交互和进度条的加载
- iOS 8 WkWebView 网页的配置和前进,后退,js 交互和进度条的加载
- js控制网页的前进和后退
- 使用web view加载网页时网页的前进、后退、刷新和取消
- css与js 输入,确认和警示框以及网页的前进后退
- 【JS】:JS实现页面的刷新,后退和前进
- WKWebView 的使用(和js交互)
- WKWebView的OC和JS交互
- iOS 加载HTML的相关问题(与JS的互相调用和WKWebView加载本地网页)
- js中的前进和后退是如何实现的
- UIWebview和WKWebview的使用 js交互 本地加载 网络加载
- iOS - OC和网页JS的交互
- iOS 介绍使用UIWebView和WKWebView加载进度条的代码+demo
- AJAX的刷新和前进后退问题解决
- vim中光标的前进和后退
- AJAX的刷新和前进后退问题解决
- AJAX的刷新和前进后退问题解决
- UIWebView的前进和后退功能
- 开源XListview 的代码分析及使用
- 学习linux的最佳方法
- idea添加jar包
- js 控制滚动条位置
- 创建提示语
- iOS 8 WkWebView 网页的配置和前进,后退,js 交互和进度条的加载
- ccf-201412-2 Z字形扫描
- Python微悟(一)
- 【iOS】判断viewcontroller 来源(展示出来)的4个方法
- Android中插件开发篇之----应用换肤原理解析
- extjs 必须项目前面红色星号
- Spring 学习笔记 (I) 之 Spring IoC
- UIAlertViewController的使用方法
- scheme,host,port,mimeType,path,pathPrefix,pathPattern用法