iOS UIWebView

iOS UIWebView与WKWebView 那些事 UIWebView是iOS 2中推出的网页容器,UIWebView是最占内存的控件;直到iOS 8以后,苹果推出了WebKit框架,其中WKWebView正式被推出来接替UIWebView的位置;iOS 12中,苹果正式弃用UIWebView,要求开发者用 WKWebView 全面替换 UIWebView,apple 官方文档。 阅读详情
设置背景透明

设置webview的backgroundColor属性为[UIColor clearColor];

webView.backgroundColor = [UIColor clearColor];
为webview中的HTML页面的body标签添加CSS背景样式设置

<body style="background-color: transparent">
    ...
</body>
设置webview的opaque属性值为NO

webView.opaque = NO;
加载本地HTML页面

方式一

NSString *localHTMLPageName = @"myPage";


NSString *path = [[NSBundle mainBundle] pathForResource:localHTMLPageName ofType:@"html"];


// 从html文件中读取html字符串
NSFileHandle *readHandle = [NSFileHandle fileHandleForReadingAtPath:path];


NSString *htmlString = [[NSString alloc] initWithData:
                    [readHandle readDataToEndOfFile] encoding:NSUTF8StringEncoding];
// 或使用                 
// NSString *htmlString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];


// baseURL用来确定htmlString的基准地址,
// 相当于HTML的<base>标签的作用,定义页面中所有链接的默认地址。
[webView loadHTMLString:htmlString baseURL:[[NSBundle mainBundle] bundleURL]];
方式二

NSString *localHTMLPageName = @"myPage";


NSString *localHTMLPageFilePath = [[NSBundle mainBundle] pathForResource:localHTMLPageName ofType:@"html"];


NSURL *localHTMLPageFileURL = [NSURL fileURLWithPath:localHTMLPageFilePath];


[webView loadRequest:[NSURLRequest requestWithURL:localHTMLPageFileURL]];
移除滚动后的外边阴影

UIWebView包含一个scrollView组件,用来将关联web内容实现滚动效果,页面滚动后的UIWebView的面板周围会出现阴影效果,该效果是在四周添加UIImageView实现的,因此移除这种阴影效果的代码如下:

    UIScrollView *scrollView = webView.scrollView;

    for (int i = 0; i < scrollView.subviews.count ; i++) {
        UIView *view = [scrollView.subviews objectAtIndex:i];
        if ([view isKindOfClass:[UIImageView class]]) {
            view.hidden = YES ;
        }
    }
参见Remove UIWebView Shadow?

在Safari中打开链接地址

默认情况下,长按web页面中的链接,系统会自动呼出菜单提供open,copy和cancel选项,但如果要实现触击链接跳转至safari中打开页面该怎么做呢?UIWebViewDelegate协议中,包含

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
接口,如果为webView添加了delegate对象并实现该接口,那么在webView加载任何一个frame之前都会delegate对象的该方法,该方法的返回值用以控制是否允许加载目标链接页面的内容,返回YES将直接加载内容,NO则反之。并且UIWebViewNavigationType枚举,定义了页面中用户行为的分类,包括

UIWebViewNavigationTypeLinkClicked,用户触击了一个链接。
UIWebViewNavigationTypeFormSubmitted,用户提交了一个表单。
UIWebViewNavigationTypeBackForward,用户触击前进或返回按钮。
UIWebViewNavigationTypeReload,用户触击重新加载的按钮。
UIWebViewNavigationTypeFormResubmitted,用户重复提交表单
UIWebViewNavigationTypeOther,发生其它行为。
因此,实现用户触击UIWebView页面中的链接,并跳至Safari中打开链接页面的步骤如下:

定义实现UIWebViewDelegate协议的类MyWebViewDelegate(通常是由包含UIWebView的controller中实现UIWebViewDelegate协议)。

按如下方式实现webView:shouldStartLoadWithRequest:navigationType:接口

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 
 navigationType:(UIWebViewNavigationType)navigationType
{
    if ( navigationType == UIWebViewNavigationTypeLinkClicked ) {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }
    return YES;
}
新建MyWebViewDelegate对象,并赋值给webView的delegate属性
参见:UIWebView open links in Safari

禁用页面滚动弹跳

之前提到UIWebView使用一个UIScrollView对象来关联web页面的内容,通过UIWebView的scrollView属性即可获得该对象,默认情况下网页长度超出设备视口长度后页面会滚动,用户使用手指滚动页面到页面边距并放开手指后页面会产生一个弹跳效果,去除这个效果的方法如下

webView.scrollView.bounces = NO ;
参见:Stop UIWebView from “bouncing” vertically?

scalesPageToFit属性

默认情况下UIWebView加载HTML页面后,会以页面的原始大小进行显示,亦即如果页面的大小超出UIWebView视口大小,UIWebView会出现滚动效果,而且用户只能通过滚动页面来查看不同区域的内容,不能使用手指的捏合手势来放大或缩小页面。通过设置

webView.scalesPageToFit = YES ;
UIWebView可以缩放HTML页面来适配其视口大小,从而达到整屏显示内容的效果,并且用户可以用捏合动作来放大或缩小页面来查看内容。

调用javascript代码

UIWebView提供

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
方法,可以在objective-c代码中调用javascript代码,参数script字符串保存了所要执行的js代码字符串,执行结果以字符串形式返回。以获取web页面标题为例,代码如下:

NSString *pageTitle = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
脚本的代码内容还要依据具体的应用场景。此外,该方法规定执行的脚本时长限定在10s内,为的是防止过长时间的阻塞页面主线程,超过执行时间上线会自动停止脚本运行,并且脚本可分配内存限定在10MB内,超过分配上线将会引发异常。

javascript调用native代码

以上提到,UIWebView加载任何一个页面之前都会调用其代理的

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 
         navigationType:(UIWebViewNavigationType)navigationType
方法,通过调用参数request对象的URL属性来获取关于本次请求的地址以及参数信息,因此可以通过js代码模拟一次特殊的网络请求来达到调用该代理方法的作用,并通过过滤“特殊的url”来达到有目的性的js代码调用native代码的效果。所谓的“特殊的url”主要的目的是达到一种标识的效果,我们可以规定url的scheme部分,如appscheme://appName?invokeMethodName=objcMethod¶mA=xxx;也可以在常规的url后面附加特殊的参数标识,如http://www.yoursite.com?objecMethodCallFlag=1&methodName=methodA¶mA=xxx。之后根据规定在代理方法中去相应的解析url并做出if else判断即可。常见的调用方式是动态添加一个隐藏的iframe标签到HTML页面,如下:

// js
function invokeObjc(url) {
    var iframe;
    iframe = document.createElement("iframe");
    iframe.setAttribute("src", url);
    iframe.setAttribute("style", "display:none;");
    document.body.appendChild(iframe);
    iframe.parentNode.removeChild(iframe);
}

var url = "appscheme://appName?invokeMethodName=objcMethod¶mA=xxx";

invokeObjc(url);

// objc
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 
         navigationType:(UIWebViewNavigationType)navigationType
{
    static NSString *callScheme = @"appscheme";

    static NSString *invokeMethodName = @"invokeMethodName";

    NSString *scheme = request.URL.scheme ;

    if ([callScheme isEqualToString:scheme]) {

        NSString *query = request.URL.query ;

        NSArray *arr = [query componentsSeparatedByString:@"&"];

        __block NSString *methodName = @"" ;

        NSMutableDictionary *params = [NSMutableDictionary new];

        // 未考虑参数的解码操作
        [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSArray *kv =[obj componentsSeparatedByString:@"="];
            if (kv) {
                if ([invokeMethodName isEqualToString: kv[0]]) {
                    methodName = kv[1];
                }else{
                    [params setObject:kv[1] forKey:kv[0]];
                }
            }
        }];
        // 获得方法名和参数之后,可以添加逻辑判断
        NSLog(@"%@",methodName);
        NSLog(@"%@",params);

        return NO ;
    }
    return YES ;

 }
前面提到的native代码调用js代码的实现方式,结合两种实现方式即完成了js与native代码间的简单的通信操作。

让UIWebView更加接近native

某些情况下,我们既想要UIWebView加载web页面,又想使得所加载的页面的外观和操作行为更加接近native感觉。这时需要使用一些CSS样式来达到这些效果,这些CSS只适用于IOS中的Safari。

-webkit-touch-callout

禁用长按触控对象弹出的菜单。IOS中,当你长按一个触控对象时,如链接,safari会弹出包含链接信息的菜单。禁用此行为CSS代码

.disable-callout{
    -webkit-touch-callout:none ;
}
或在webViewDidFinisheLoad中使用

 [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
-webkit-user-select

控制用户是否可以选择页面元素内容。IOS中,在页面元素中进行长按操作,safari会弹出菜单,来允许进行选择行为。禁用此行为代码

.disable-select{
    -webkit-user-select:none;
}
或在webViewDidFinisheLoad中使用

 [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
-webkit-tap-highlight-color

覆盖当用户tap链接或clickable元素时默认产生的高亮颜色(灰色)。如

.no-highlight{
    -webkit-tap-highlight-color:rgba(0,0,0,0);
}

深入理解iOS WebView Hybrid开发中的预加载技术 本文还有配套的精品资源,点击获取 简介:本文探讨了iOS中Webview与Hybrid开发相结合的技术及其预加载策略。Webview组件使得iOS应用能够展示网页内容并与原生功能集成。Hybrid开发模式利用JavaScript和原生语言的融合,提升应用性能。预加载技术通过提前下载和解析资源来优化用户体验和减少加载时间。文章还介绍了预加载的方法,如启动时加载资源、利用HTM... 阅读详情

相关推荐

Vue项目实战:5分钟搞定高德地图离线部署(附避坑指南)

本文详细介绍了在Vue项目中实现高德地图离线部署的完整方案。针对内网或网络隔离环境,通过获取并改造JSAPI文件、下载组织地图瓦片数据,并集成vue-amap组件,实现地图功能的本地化运行。文中提供了核心代码、避坑指南及性能优化建议,帮助开发者快速构建稳定可靠的离线地图应用。

data3的博客 935

UIWebView的一些用法总结

为什么80%的码农都做不了架构师?>>> ...

weixin_34409703的博客 265

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

本文详细介绍了企业微信群机器人Webhook的配置流程,从创建机器人到获取Webhook地址,再到发送各类消息的完整步骤。通过Python代码示例展示了文本、Markdown等消息类型的发送方法,并提供了性能优化建议和常见问题排查技巧,帮助企业高效实现自动化消息推送。

weixin_29208327的博客 6817

uiwebview 和navigation 结合使用

uiwebview 和navigation 结合使用 例如 点击 uiwebview种的一个标题 然后链接到详细内容查看页面 然后点导航上的返回 又回到前一个页面? - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebVi

freezing_yu的专栏 729

英飞凌AURIX 2G 系列MCU关于外设模块EVADC的实现原理及对应MCAL(EB Tresos)配置项详细讲解

本文章讲述了英飞凌AURIX 2G系列MCU关于外设模块EVADC的实现原理及对应MCAL配置工具(EB)的配置项。

weixin_46176506的博客 6274

2026闲鱼数据采集实战:本地YOLO识别滑块验证码+接口签名分析+零成本价格监控系统

2026闲鱼反爬系统升级实战:零成本解决方案 本文针对2026年闲鱼最新反爬机制提出了一套完整的零成本解决方案。系统面临四大挑战:AI滑块验证、接口签名升级、设备指纹绑定和精细化行为检测。通过以下技术突破实现稳定运行: 本地化AI破解:训练YOLOv11n模型实现98%准确率的滑块识别,替代付费打码平台 逆向工程:Hook闲鱼App签名算法,用Python重写HMAC-SHA256签名生成器 设备指纹管理:建立"一机一号一IP"机制,维护50+种设备特征 行为模拟:开发四阶段滑动轨迹模型

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1452

ios首次加载web_iOS预加载Web页面方案

iOS预加载Web页面方案可以预加载多个网址,然后在离线状态去显示那几个网址,看看是不是都完全缓存下来了。使用方法在需要开启预加载的地方创建self.sCache = [STMURLCache create:^(STMURLCacheMk *mk) {mk.whiteListsHost(whiteLists).whiteUserAgent(@"starming");}];这里是所有可设置项目,默认...

weixin_39789101的博客 522

从DDPM到DDIM:深入解读《Denoising Diffusion Implicit Models》

DDIM发表在ICRL2021上,是DDPM重要的改进之一,能显著提高DDPM的样本质量、减少采样时间,并且能显式控制插值,已经被广泛应用到现在的Diffusion Models上。这篇博客和大家一起详细解读一下DDIM,认识这一伟大的模型。.........

沉迷单车的追风少年 1万+

将View设置为Opaque

转自:http://www.tiboo.cn/dianzijie/b1837169/ This property provides a hint to the drawing system as to how it should treat the view. If set to YES, the drawing system treats the view as fully opaqu

wy10207010219的专栏 2984

【swjtu】算法实验2.4分析算法时间复杂度

分析给定算法的时间复杂度。 上机实验,绘制不同输入情况下的运行时间曲线,并与(1)中的分析结果进行比较。 撰写相应的实验报告,实验报告内容包括:实验目的、实验任务、 实验环境、实验步骤、实验结果及其分析以及实验总结等部分内容。

qq_52046937的博客 730

基于Simulink的四足机器人楼梯攀爬仿真模型

构建一个基于Simulink的四足机器人楼梯攀爬仿真模型,旨在模拟四足机器人在面对楼梯等障碍时的运动控制和稳定性调整。以下是一个详细的步骤指南,帮助你从零开始创建这样一个仿真模型。

xiaoheshang_123的博客 247

iOS UIWebView与WKWebView

第一章 - 引言在iOS开发中,WebView是一种常见的控件,用于在应用中显示网页内容。在过去,我们主要使用UIWebView作为WebView控件,但自iOS 8起,苹果推出了WKWebView,作为UIWebView的升级版本。本文将介绍UIWebView和WKWebView的特点、使用方法和案例。

good7ob的博客 1727

一篇文章带你快速入门 MATLAB

文章目录一、认识 MATLAB 界面二、MATLAB 的运行方式三、Matlab 中的窗口1. 命令窗口2. MATLAB的程序编辑窗口3. 工作空间窗口4. 命令历史窗口5. 图形窗口6. 当前目录窗口四、MATLAB的帮助系统1. 帮助命令2. 联机帮助五、其他知识补充1. MATLAB的搜索路径2. 变量命名规则3. M文件命名规则 一、认识 MATLAB 界面 在 MATLAB Desktop 中,工具条取代了菜单和工具栏。应用程序库收纳了 MATLAB 产品系列的应用程序,单一文件应用程序打包为一

南淮北安的博客 5126

IOS之浅谈UIWebView

**实现的功能:**这个小demo的基本功能是在文本区输入网址,点击确定按钮后加载网页。加载中显示旋转轮。以下直接给出代码,重要部分加上了注释。 代码实现: .h文件: #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIWebViewDelegate> @property (stro...

马一凡的博客 584

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

iOS开发之UIWebView入门教程

iOS开发之UIWebView入门教程          UIWebView是iOS sdk中一个最常用的控件。是内置的浏览器控件,我们可以用它来浏览网页、打开文档等等。这篇文章我将使用这个控件,做一个简易的浏览器。如下图: 我们创建一个Window-based Application程序命名为:UIWebViewDemo UIWebView的loadRequest可以用来加载

孙建军的博客 932

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

浅谈iOS之UIWebView

前言 在iOS开发过程中,经常用到一些H5交互的页面需要处理,iOS中H5开发的控件之一UIWebView的使用是必须熟练的掌握的。 一、UIWebView 介绍 UIWebView继承与UIView,因此,其初始化方法和一般的View一样,通过alloc和init进行初始化。 UIWebView 是用来加载加载网页数据的一个框。UIWebView可以用来加载pdf、word、doc...

Future_One的专栏 584

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

iOS 中UIWebView与WKWebView

1. UIWebView UIWebView 适用于iOS8.0以下的系统版本 iOS原生没有提供js直接调用OC的方式,只能通过UIWebView的UIWebViewDelegate协议方法来做拦截,并在这个方法中,根据url来调用OC方法; -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest ...

gsl111000的博客 333

IOS之UIWebView的使用

现在对于 混合式 移动端开发越来越流行,因为开发成本上、速度上都比传统的APP开发要好,混合式开发 是传统模式与PC网页端相结合的模式。那么提到了 APP的混合模式开发,在Android开发中有WebView作为混合模式开发的桥梁,当然在IOS中也同样有一个 UIWebView 组件来作为混合模式开发的桥梁,那么下面就对UIWebView的一些基本知识详解一下。

zyxNobita专栏 1236

iOS组件之UIWebView详解

引言 UIWebView是继承于UIView(有关UIView请参照《iOS组件之UIView详解》),在您的应用程序中,您可以使用UIWebView嵌入网页内容。要做到这一点,你只需创建一个UIWebView对象,将其附加到一个窗口,并发送一个请求来加载网页内容。您也可以使用此类前进和后退的网页的历史记录,甚至可以通过编程设置一些网页内容属性。 目录 1、基本属性及方法 2、iOS

ZuoChiYu的专栏 888

iOS UIWebView 缩放

因为写了响应式的界面至页面不能缩放效果 _webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); _webView.scalesPageToFit = YES; _webView.multipleTouchEnabled = YES;

Wx_H_的博客 6899

IOS中UIWebView和JavaScript交互

本文主要介绍IOS中UIWebview与JS之间的交互过程。 博客地址:http://webfrogs.github.com/IOS/2012/11/02/webviewandjs/

ccf的专栏 1609

iOS-UIWebView简单使用

1、什么是UIWebView UIWebView是ios内置的浏览器控件,可以用来直接加载远程的网页资源,也可以加载绝大部分的常见文件htm/html、txt、pdf/keynote、ppt、doc/docx、音视频文件等等,还可以通过调用UIWebView提供的api实现页面的前进、后退、刷新等动作,甚至还可以动态的设置网页内容。 2.简单使用加载网页 /** [UI...

SunSatan的博客 960

iOS UIWebView 403/404

问题描述     与WindowsPhone不同,iOS UIWebView并不认为403/404这种情况下页面访问是失败的,这也情有可原,但有时候,我们需要对WebView所遇到的403/404进行处理。 解决思路     由于WebView在回调事件,要么发生在NSURLConnection请求之前:         - (BOOL)webView:(UIWebView *)web

waterforest的专栏 8519

iOS中UIWebView的使用详解

iOS中UIWebView的使用详解一、初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种: 第一种: (void)loadRequest:(NSURLRequest *)request; 这是加载网页最常用的一种方式,通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的,例如我

zhou_aa的博客 1477

iOS菜鸟学习——UIWebView的使用

在iOS开发中,经常会需要打开一些网页信息,UIWebView是在程序之内打开一个URL。下面我们来了解一下UIWebView的使用。 首先UIWebView如何加载URL。第一种是loadRequest:方法,用法如下:  NSURL *url = [[NSURL alloc] initWithString:@"http://google.com"]; NSUR

soloterry的专栏 1814

UIWebView/iOS内置的浏览器控件

UIWebView/iOS内置的浏览器控件 作用:可以浏览网页、打开文档等 能够加载html/htm、pdf、docx、txt等格式的文件 一、根据网站打开网页 1、.h文件要包含协议 2、建立UIWebView UIWebView *webView=[[UIWebView alloc] initWithFrame:CGRectMake

TomLD的博客 1262
上一篇: iOS 使用ARC的工程怎么同时再引用MRC的第三方类库
下一篇: XMPPFramework
vaercly
博客等级 码龄12年 46粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值