iOS 介绍使用UIWebView和WKWebView加载进度条的代码+demo

WKWebView的详细使用 WKWebView的详细使用demo 立即下载

简介

如果项目支持iOS7之前的系统版本的话,可以做个系统判断,这里就不介绍了,这里还是推荐使用WKWebView,先介绍下使用这个的好处,然后介绍使用UIWebView和WKWebView加载进度条的代码。

开发App的过程中,常常会遇到在App内部加载网页,通常用UIWebView加载。这个自iOS2开始使用的网页加载器一直是开发的心病:加载速度慢,占用内存多,优化困难。如果加载网页多,还可能因为过量占用内存而给系统kill掉。各种优化的方法效果也不那么明显。


iOS8以后,苹果推出了新框架Wekkit,提供了替换UIWebView的组件WKWebView。各种UIWebView的问题没有了,速度更快了,占用内存少了,一句话,WKWebView是App内部加载网页的最佳选择!

先看下 WKWebView的特性:

  1. 在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存,模拟器加载百度与开源中国网站时,WKWebView占用23M,而UIWebView占用85M);
  2. 允许JavaScript的Nitro库加载并使用(UIWebView中限制);
  3. 支持了更多的HTML5特性;
  4. 高达60fps的滚动刷新率以及内置手势;
  5. 将UIWebViewDelegate与UIWebView重构成了14类与3个协议(查看苹果官方文档);


一、首先介绍UIWebview进度条的使用方法

不同于WKWebview,wk是有自己的加载进度值的,我们可以直接通过kvo检测到,并显示到进度条内。

 

但如果我们为了适配ios7,只能使用UIWebview了,这里的加载进度,就比较尴尬了

 

所以我们的实现方式就是:模拟进度-俗称假进度。

实现原理:

自定义一个UIView的进度条,添加到Nav下方,给予两个方法:

1、startLoadingAnimation  开始加载

2、endLoadingAnimation  结束加载

 

开始加载,先动画模拟一个0.4s的加载,加载宽度为0.6倍屏幕宽度,动画结束,再0.4s实现,总共0.8倍的屏幕宽度。

结束动画,动画模拟1.0倍数的屏幕宽度,实现全部加载完成,并最后隐藏掉进度条。

 

代码:

.h文件

复制代码
#import <UIKit/UIKit.h>

@interface WebviewProgressLine : UIView

//进度条颜色
@property (nonatomic,strong) UIColor  *lineColor;

//开始加载
-(void)startLoadingAnimation;

//结束加载
-(void)endLoadingAnimation;

@end
复制代码

 

.m文件

复制代码
#import "WebviewProgressLine.h"

@implementation WebviewProgressLine

-(instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.hidden = YES;
        self.backgroundColor = [UIColor whiteColor];
    }
    return self;
}

-(void)setLineColor:(UIColor *)lineColor{
    _lineColor = lineColor;
    self.backgroundColor = lineColor;
}

-(void)startLoadingAnimation{
    self.hidden = NO;
    self.width = 0.0;
    
    __weak UIView *weakSelf = self;
    [UIView animateWithDuration:0.4 animations:^{
        weakSelf.width = KScreenWidth * 0.6;
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.4 animations:^{
            weakSelf.width = KScreenWidth * 0.8;
        }];
    }];
    
    
}

-(void)endLoadingAnimation{
    __weak UIView *weakSelf = self;
    [UIView animateWithDuration:0.2 animations:^{
        weakSelf.width = KScreenWidth;
    } completion:^(BOOL finished) {
        weakSelf.hidden = YES;
    }];
}

@end
复制代码

 

webview页面使用:

复制代码
#import "webviewViewController.h"
#import "WebviewProgressLine.h"

@interface webviewViewController ()<UIWebViewDelegate>
@property (nonatomic,strong) UIWebView  *webview;
@property (nonatomic,strong) WebviewProgressLine  *progressLine;

@end

@implementation webviewViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    self.webview = [[UIWebView alloc] initWithFrame:self.view.frame];
    self.webview.delegate = self;
    [self.view addSubview:self.webview];
    
    self.progressLine = [[WebviewProgressLine alloc] initWithFrame:CGRectMake(0, 64, KScreenWidth, 3)];
    self.progressLine.lineColor = [UIColor redColor];
    [self.view addSubview:self.progressLine];
    
    
    NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
    [self.webview loadRequest:[NSURLRequest requestWithURL:url]];
    
}

-(void)webViewDidStartLoad:(UIWebView *)webView{
    [self.progressLine startLoadingAnimation];
}

-(void)webViewDidFinishLoad:(UIWebView *)webView{
    [self.progressLine endLoadingAnimation];
}

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    [self.progressLine endLoadingAnimation];
}
复制代码


二、介绍WKWebview进度条使用方法

iOS8之后就可以使用WKWebview了

1.添加UIProgressView属性

@property (nonatomic, strong) WKWebView *wkWebView;
@property (nonatomic, strong) UIProgressView *progressView;

2.初始化progressView

- (void)viewDidLoad {
    [super viewDidLoad];    
    //进度条初始化
    self.progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, 20, [[UIScreen mainScreen] bounds].size.width, 2)];
    self.progressView.backgroundColor = [UIColor blueColor];
    //设置进度条的高度,下面这句代码表示进度条的宽度变为原来的1倍,高度变为原来的1.5倍.
    self.progressView.transform = CGAffineTransformMakeScale(1.0f, 1.5f);
    [self.view addSubview:self.progressView];
}

3.添加KVO,WKWebView有一个属性estimatedProgress,就是当前网页加载的进度,所以监听这个属性。

[self.wkWebView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];

4.在监听方法中获取网页加载的进度,并将进度赋给progressView.progress

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    if ([keyPath isEqualToString:@"estimatedProgress"]) {
        self.progressView.progress = self.wkWebView.estimatedProgress;
        if (self.progressView.progress == 1) {
            /*
             *添加一个简单的动画,将progressView的Height变为1.4倍,在开始加载网页的代理中会恢复为1.5倍
             *动画时长0.25s,延时0.3s后开始动画
             *动画结束后将progressView隐藏
             */
            __weak typeof (self)weakSelf = self;
            [UIView animateWithDuration:0.25f delay:0.3f options:UIViewAnimationOptionCurveEaseOut animations:^{
                weakSelf.progressView.transform = CGAffineTransformMakeScale(1.0f, 1.4f);
            } completion:^(BOOL finished) {
                weakSelf.progressView.hidden = YES;

            }];
        }    
    }else{
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

5.在WKWebViewd的代理中展示进度条,加载完成后隐藏进度条

//开始加载
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
    NSLog(@"开始加载网页");
    //开始加载网页时展示出progressView
    self.progressView.hidden = NO;
    //开始加载网页的时候将progressView的Height恢复为1.5倍
    self.progressView.transform = CGAffineTransformMakeScale(1.0f, 1.5f);
    //防止progressView被网页挡住
    [self.view bringSubviewToFront:self.progressView];
}

//加载完成
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    NSLog(@"加载完成");
    //加载完成后隐藏progressView
    //self.progressView.hidden = YES;
}

//加载失败
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
    NSLog(@"加载失败");
    //加载失败同样需要隐藏progressView
    //self.progressView.hidden = YES;
}

6.在dealloc中取消监听

- (void)dealloc {
    [self.wkWebView removeObserver:self forKeyPath:@"estimatedProgress"];
}

三、总结

一般h5页面有联系我们然后点击拨打电话的功能,在使用的时候发现了UIWebView加载的H5,可以调用;但是WKWebView就是不行,解决WKWebView加载H5页面,无法调用拨打电话功能的问题

H5的拨打电话代码是

<a href="tel:13112345678">移动WEB页面JS一键拨打号码咨询功能</a>

解决的方法:在WKWebView的WKNavigationDelegate代理方法处理

解决代码如下:

// 处理拨打电话以及Url跳转等等

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

    NSURL *URL = navigationAction.request.URL;

    NSString *scheme = [URLscheme];

    if ([schemeisEqualToString:@"tel"]) {

        NSString *resourceSpecifier = [URLresourceSpecifier];

        NSString *callPhone = [NSStringstringWithFormat:@"telprompt://%@", resourceSpecifier];

        /// 防止iOS 10及其之后,拨打电话系统弹出框延迟出现

        dispatch_async(dispatch_get_global_queue(0,0), ^{

            [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:callPhone]];

        });

    }

    decisionHandler(WKNavigationActionPolicyAllow);

}


demo的地址:

https://github.com/joinxinxu/WebLoad.git


WKWebViewJS调用OC Demo WKWebView JS调用OC Demo,包含html文件。 window.webkit.messageHandlers.方法名.postMessage(参数); 立即下载

相关推荐

WKWebView-:一个WKWebView加载网页,iOS与js交互的demo

WKWebView- 一个WKWebView加载网页,iOS与js交互的demo

找到的关于WKWebView的使用总结(附上一个相当好的Demo)

参考文章(阅读顺序排列, 对于基本的不再赘述) WKWebView的特性并与WebView进行对比 基本使用 参考的GitHub地址 WKWebViewSimpleDemo 附言 在搜索WKWebView的时候,发现并没有太好的博客介绍,可能因为还是UIWebView时代的比较多 另外,我觉得你写博客不带上Github的Demo地址,常常看了半袋呢,满头雾水,因此在GitHub上搜索到了一个相当...

KevinAshen的博客 901

WKWebViewDemo

这是一个WKWebView的简单使用demo,包含于H5的一些简单交互。

IOS WKWebView初级使用 以及WKWebView进度条的添加

WKWebView 相比UIWebView 在稳定性,性能,功能方面有很大提升 (战友内存比webView小,缺点 不支持缓存和NSURLProtocol)增加了加载进度条 //创建方法 #import

Goods_boy的博客 1936

WKWebView实例

简单的WKWebView的开发实例,完整的加载使用销毁流程。

IC设计新手必看:如何正确使用去耦电容(decap)避免电源噪声?

本文深入探讨了IC设计中去耦电容(decap)的应用技巧,从核心原理到布局实现,帮助新手工程师有效抑制电源噪声。文章详细解析了MIM、MOM等电容类型的特性与选择策略,并提供了先进的布局技巧和验证方法,特别适用于28nm以下先进工艺的电路设计挑战。

weixin_30555125的博客 114

WKWebViewDemo: 高性能的iOS Web视图解决方案

WKWebViewDemo: 高性能的iOS Web视图解决方案 项目简介 WKWebViewDemo 是一个开源的iOS应用示例项目,它展示了如何利用Apple的WKWebView组件来替代旧的UIWebView,以提供更高效、更安全的网页加载和交互体验。该项目由开发者维护,其目标是帮助开发者理解和应用WKWebView,并提升他们的iOS应用性能。 技术分析 WKWebView是Apple在i...

gitblog_00056的博客 475

24位ADC的精度陷阱:为什么你的ADS1232实测性能不达标?

本文深入探讨了24位ADC芯片ADS1232在实际应用中性能不达标的原因,揭示了高精度ADC性能依赖周边电路设计的关键问题。通过分析电源系统、参考电压稳定性、PCB布局等常见陷阱,提供了优化方案和调试技巧,帮助工程师充分发挥ADS1232的潜力,实现接近理论值的测量精度。

weixin_28285943的博客 405

WKWebViewDemo 项目教程

WKWebViewDemo 项目教程 1、项目介绍 WKWebViewDemo 是一个基于 Swift 和 WKWebView 的 iOS 应用示例项目。该项目旨在帮助开发者快速理解和使用 WKWebView 组件,实现简单的网页浏览功能。WKWebView 是 Apple 提供的一个高性能的网页视图组件,适用于在 iOS 应用中嵌入网页内容。 2、项目快速启动 环境准备 Xcode 12.0 ...

gitblog_00049的博客 984

避开内存陷阱:手把手教你用RKNN零拷贝接口正确管理输入输出Tensor

本文深入解析RKNN零拷贝接口在边缘计算中的高效内存管理策略,通过YOLOX实例演示如何避免内存对齐错误和数据错位。详细介绍了`rknn_tensor_mem`系列API的正确使用方法,包括内存创建、绑定、释放全流程,以及性能优化技巧如内存池技术和多核NPU负载均衡,帮助开发者提升推理效率并避开常见陷阱。

weixin_33686714的博客 160

逆向解析抖音核心校验参数:bd-ticket-guard-client-data的Python生成逻辑

本文深入解析了抖音核心校验参数bd-ticket-guard-client-data的生成逻辑,详细介绍了其动态证书生成、非对称加密机制及Python实现方法。通过逆向分析,揭示了抖音安全体系的双层验证机制,包括RSA密钥对生成、证书签名及时间戳校验等关键技术要点,为开发者提供了一套完整的参数生成解决方案。

weixin_26642481的博客 405

iOS WKWebView的使用

前言 最近项目中的UIWebView被替换为了WKWebView,因此来总结一下。 示例Demo:WKWebView的使用 本文将从以下几方面介绍WKWebView: 1、WKWebView涉及的一些类 2、WKWebView涉及的代理方法 3、网页内容加载进度条和title的实现 4、JS和OC的交互 5、本地HTML文件的实现 6、WKWebView+UITableView混排 7、WKWebView离线缓存功能 一、WKWebView涉及的一些类 WKWebView:网页的渲染与展示 注意: #i

假装你是大灰狼的专栏 2804

SAP 资产主数据屏幕增强:对比字段追加与子屏幕/页签 2 种方案优劣

本文深入对比了SAP资产主数据(AS01/AS03)屏幕增强的两种方案:字段追加与子屏幕/页签。从技术实现、业务适配、系统维护等维度分析各自优劣,提供方案选型决策树和混合方案实践建议,帮助企业在SAP实施中做出最优选择。

weixin_28559803的博客 283

iOS 加载webView进度条

项目demo链接:https://github.com/MinLee6/WebViewLoadProgress 现在的app常常会嵌入不少的h5页面,这里参照微信显示web页面的方式,做了一个导航栏下的加载进度条.因为项目最低支持iOS7,所以不能使用WKWebView来加载网页,只能使用 UIWebView,查看 UIWebView的API可以发现,并没有代理或是通知告诉我们webView加载了多少,所以这个进度条我决定用虚拟的方式来做,就是假装知道加载了多少.

Leemin_ios的博客 3997

三. zemax光学设计流程+案例

文章目录zemax 基本操作:1. 建立光学基本模型2. 像质评价3. 优化(重点)4. 公差分析简单镜头设计 zemax 基本操作: 1. 建立光学基本模型 2. 像质评价 3. 优化(重点) 对系统设定的约束条件或目标值 统称为操作数。 操作数: 光学特性参数(焦距EFFL,近轴放大率PMAG,入瞳位置EMPP) 像差参数(球差SPHA,彗差COMA,像散ASTI) 边界条件(中心厚度值CTVA,边缘厚度值ETAV) 优化的主要步骤: 设置评价函数和优化操作数 一般小像差系统采用波像差 构建

Taiiiii的博客 8050

openclaw 保姆级部署与核心玩法解析:国产DeepSeek模型 + 飞书

OpenClaw是一款功能强大的开源AI个人助理,支持全平台私有化部署,数据完全本地掌控。它不仅可通过聊天窗口直接操控电脑(安装软件、创建项目),还支持接入飞书等主流通讯工具,化身24小时在线的智能助理。本文提供了从零开始的详细部署教程,涵盖基础安装、模型配置(如GLM-4、DeepSeek)到飞书集成的完整实战指南,助你将这款“核动力”AI助手快速融入日常工作流。

甘蓝的专栏 2997

UIWebView的加载进度条

导语 在一个阳光明媚的午后,组织终于决定把公司的SDK产品,由Native更换成H5,你没看错,就是用Native界面做的SDK,说多了都是眼泪。产品说,网页加载的时候要有进度条,OK,没问题,一个字就是“干”,你懂的。 现在的iOS 应用中,或多或少都会有H5页,因为H5有Native所不具备的灵活性,比如应用中的活动展示,需要不定时的更新,使用H5来做就能轻松搞定!iOS中常用的H5容器有两种:1、 UIWebView 2、WKWebView。 WKWebView是iOS8.0以后开放的AP.

Gabriel的专栏 486

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

LeeKwen的专栏 2169

UIWebView和WKWebView的使用及js交互

UIWebView和WKWebView的使用及js交互 web页面和app直接的交互是很常见的东西,之前尝试过flex和js的相互调用以及android和js的相互调用,却只有ios没试过,据说比较复杂。周末花了点时间研究了一下,确实和其他的不太一样,但是 也不见复杂。 要知...

chuanao8829的博客 196

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

iOS 使用WKWebView加载h5页面无法调用拨打电话功能

一般h5页面有联系我们然后点击拨打电话的功能,在使用的时候发现了UIWebView加载的H5,可以调用;但是WKWebView就是不行,解决WKWebView加载H5页面,无法调用拨打电话功能的问题 H5的拨打电话代码是 移动WEB页面JS一键拨打号码咨询功能 解决的方法:在WKWebView的WKNavigationDelegate代理方法处理 解决代码如下:

3548

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ios wkwebview弹框_iOS WKWebView的使用

前言最近项目中的UIWebView被替换为了WKWebView,因此来总结一下。示例Demo:WKWebView的使用本文将从以下几方面介绍WKWebView:1、WKWebView涉及的一些类2、WKWebView涉及的代理方法3、网页内容加载进度条和title的实现4、JS和OC的交互5、本地HTML文件的实现一、WKWebView涉及的一些类WKWebView:网页的渲染与展示注意: #im...

weixin_33245447的博客 340

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

UIWebView转WKWebView交互方法统一解决办法

iOS13发布了,据说苹果开始拒绝使用UIWebView的api应用了。 有点慌,由于项目自17年开始就一直用的UIWebView,但UIWebView性能实在是太差了,进几个网页内存就飙升,并且退出页面VC销毁了但内存还无法降下来,首次加载网页的时候还会卡那么一会,只能弄个假进度条。 虽然中途也一直寻思着升级到WKWebView,但奈何项目中业务众多又是分布式的,和js交互的地方也很多,而WKWebView和UIWebView的交互方法写法又不一样,前端得区分是Android还是iOS,所有有交互的地

Gabriel的专栏 758

OC WKWebView的使用

前言 最近项目中的UIWebView被替换为了WKWebView,因此来总结一下。 示例Demo:WKWebView的使用 本文将从以下几方面介绍WKWebView: 1、WKWebView涉及的一些类 2、WKWebView涉及的代理方法 3、网页内容加载进度条和title的实现 4、JS和OC的交互 5、本地HTML文件的实现 一、WKWebView涉及的一些类 WKWebView:网页的渲染与展示 注意: #import <WebKit/WebKit.h> ..

迦南的专栏 1827

iOS-仿支付宝加载web网页添加进度条

代码地址如下:http://www.demodashi.com/demo/11727.html 目前市场上APP常会嵌入不少的h5页面,参照支付宝显示web页面的方式, 做了一个导航栏下的加载进度条. 因为项目最低支持iOS7,所以不能使用WKWebView来加载网页, 只能使用 UIWebView, 但是查看 UIWebView的API, 并没有代理或是通知告诉我们webView加载了多少, 所以

findhappy117的博客 890
上一篇: iOS之Runtime的理解和使用
下一篇: Xcode 真机调试报错:This application's application-identifier entitleme
xinxu-dev
博客等级 码龄12年 16粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值