iOS UIWebView简单用法

前言

好久没有写简书了,突然感觉有点生疏。最近一直在思考人生,不知道何去何从。总之,就是头疼……好了,废话不多说,今天来记录一下UIWebView,随着H5的流行,UIWebView也火了起来,对于平时不怎么使用UIWebView的我来说,真该学习一下了。(正好,最近自己也在学习H5),下来我给大家介绍一下OC与JS的交互,但是前提是,你得熟悉UIWebView。

UIWebView基本用法

UIWebView的基本用法都是一些很简单的东西,相信只要你会用UIButton,一般就能搞定UIWebView。

UIWebView加载

UIWebView提供了三种加载html界面的方法:

/**通过NSURLRequest去加载html界面**/
- (void)loadRequest:(NSURLRequest *)request;
/**加载html格式的字符串,其中的baseUrl下面会介绍**/
- (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
/**这种方式表示没见到过,我也不知道是什么,有兴趣的可以自己去查查**/
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;(*很少用*)

示例如下:

  • (void)loadRequest:(NSURLRequest *)request方法即可以去通过网络连接加载html资源,也可以去加载本地的html资源。
    加载网络地址
    NSURLRequest request =[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.superqq.com"]];
    [self.view addSubview:webView];
    [webView loadRequest:request];
    加载本地Html
    NSString path = [[NSBundle mainBundle] pathForResource:@"swift" ofType:@"html"];
    NSURL
    url = [NSURL fileURLWithPath:path];//创建URL
    NSURLRequest
    request = [NSURLRequest requestWithURL:url];//创建NSURLRequest
    [webView loadRequest:request];//加载

  • (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL方法一般用来加载本地的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]];
    

注意:baseURLbaseURL用来确定htmlString的基准地址,相当于HTML的<base>标签的作用,定义页面中所有链接的默认地址。具体查看W3C上的base标签。
baseURL是HTML字符串中引用到资源的查找路径,当HTML中没有引用外部资源时,可以指定为nil;若引用了外部资源(外部资源:除了html代码以外,界面中所有的图片,链接都属于外部资源),一般情况下使用mainBundle的路径即可。在实际操作中,常常会出现「文本显示正常,图片无法显示」等情况,若HTML文本中引用外部资源都是使用相对路径,则出现这种问题的原因一般都是baseURL参数错误。

UIWebView的一些常用属性和方法(这部分东西转载自:http://www.jianshu.com/p/fbdb09b6b564
**webView的代理**
@property (nullable, nonatomic, assign) id <UIWebViewDelegate> delegate;
**内置的scrollView**
@property (nonatomic, readonly, strong) UIScrollView       
*scrollView NS_AVAILABLE_IOS(5_0);
**URL请求**
@property (nullable, nonatomic, readonly, strong) NSURLRequest *request;
**是否缩放到适合屏幕大小**
@property (nonatomic) BOOL scalesPageToFit;
**执行javaScript操作**
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
加载属性
- (void)reload; //重新加载数据
- (void)stopLoading; //停止加载数据
@property (nonatomic, readonly, getter=isLoading) BOOL loading; //是否正在加载
- (void)goBack; //返回上一级
- (void)goForward; //跳转下一级
@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack; //能否返回上一级
@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward; //能否跳转下一级
多媒体属性
//YES,自动检测网页上的电话号码,单击可以拨打 
@property (nonatomic) BOOL detectsPhoneNumbers NS_DEPRECATED_IOS(2_0, 3_0);
//设置某些数据变为链接形式,这个枚举可以设置如电话号,地址,邮箱等转化为链接
@property (nonatomic) UIDataDetectorTypes dataDetectorTypes NS_AVAILABLE_IOS(3_0);
//设置是否使用内联播放器播放视频
@property (nonatomic) BOOL allowsInlineMediaPlayback NS_AVAILABLE_IOS(4_0); // iPhone Safari defaults to NO. iPad Safari defaults to YES
//设置视频是否自动播放
@property (nonatomic) BOOL mediaPlaybackRequiresUserAction NS_AVAILABLE_IOS(4_0); // iPhone and iPad Safari both default to YES
//设置音频播放是否支持ari play功能
@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay NS_AVAILABLE_IOS(5_0); // iPhone and iPad Safari both default to YES
//设置是否将数据加载如内存后渲染界面
@property (nonatomic) BOOL suppressesIncrementalRendering NS_AVAILABLE_IOS(6_0); // iPhone and iPad Safari both default to NO
//设置用户交互模式
@property (nonatomic) BOOL keyboardDisplayRequiresUserAction NS_AVAILABLE_IOS(6_0);
iOS7.0 新特性
@property (nonatomic) UIWebPaginationMode paginationMode NS_AVAILABLE_IOS(7_0);
这个属性用来设置一种模式,当网页的大小超出view时,将网页以翻页的效果展示,枚举如下:
typedef NS_ENUM(NSInteger, UIWebPaginationMode) 
{ 
  UIWebPaginationModeUnpaginated, //不使用翻页效果 
  UIWebPaginationModeLeftToRight, //将网页超出部分分页,从左向右进行翻页 
  UIWebPaginationModeTopToBottom, //将网页超出部分分页,从上向下进行翻页 
  UIWebPaginationModeBottomToTop, //将网页超出部分分页,从下向上进行翻页 
  UIWebPaginationModeRightToLeft //将网页超出部分分页,从右向左进行翻页
} __TVOS_PROHIBITED;
//设置每一页的长度
@property (nonatomic) CGFloat pageLength NS_AVAILABLE_IOS(7_0);
//设置每一页的间距
@property (nonatomic) CGFloat gapBetweenPages NS_AVAILABLE_IOS(7_0);
//获取分页数
@property (nonatomic, readonly) NSUInteger pageCount NS_AVAILABLE_IOS(7_0);

@property (nonatomic) UIWebPaginationBreakingMode paginationBreakingMode NS_AVAILABLE_IOS(7_0);
typedef NS_ENUM(NSInteger, UIWebPaginationBreakingMode) 
{ 
  UIWebPaginationBreakingModePage,       
  UIWebPaginationBreakingModeColumn
} __TVOS_PROHIBITED;
iOS9.0新特性
//是否允许画中画播放
@property (nonatomic) BOOL allowsPictureInPictureMediaPlayback NS_AVAILABLE_IOS(9_0);
 //A Boolean value that determines whether pressing on a link displays a preview of the destination for the link.
This property is available on devices that support 3D Touch. Default value is NO.
@property (nonatomic) BOOL allowsLinkPreview NS_AVAILABLE_IOS(9_0); //
UIWebView的代理方法
//设置代理,同时实现UIWebViewDelegate
webView.delegate = self;

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

UIWebViewNavigationTypeLinkClicked,用户触击了一个链接。
UIWebViewNavigationTypeFormSubmitted,用户提交了一个表单。
UIWebViewNavigationTypeBackForward,用户触击前进或返回按钮。
UIWebViewNavigationTypeReload,用户触击重新加载的按钮。
UIWebViewNavigationTypeFormResubmitted,用户重复提交表单
UIWebViewNavigationTypeOther,发生其它行为。
*/
    return YES;
}

- (void)webViewDidStartLoad:(UIWebView *)webView
{
    //开始加载,可以加上风火轮(也叫菊花)
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    //完成加载
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    //加载出错
}
禁用页面滚动弹跳
webView.scrollView.bounces = NO ;
移除滚动后的外边阴影

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 ;
    }
}  
处理webView展示txt文档乱码问题
if ([theType isEqualToString:@".txt"])
{
     //txt分带编码和不带编码两种,带编码的如UTF-8格式txt,不带编码的如ANSI格式txt
     //不带的,可以依次尝试GBK和GB18030编码
     NSString* aStr = [[NSString alloc] initWithData:attachmentData encoding:NSUTF8StringEncoding];
     if (!aStr) {
     //用GBK进行编码
     aStr=[[NSString alloc] initWithData:attachmentData encoding:0x80000632];
     }
     if (!aStr) {
     //用GBK编码不行,再用GB18030编码 
     aStr=[[NSString alloc] initWithData:attachmentData encoding:0x80000631];
     }
    //通过html语言进行排版 
    NSString* responseStr = [NSString stringWithFormat: 
                @"<HTML>" 
                   "<head>"
                   "<title>Text View</title>" 
                   "</head>" 
                  "<BODY>" 
                  "<pre>" "%@" "/pre>" 
                  "</BODY>" 
                  "</HTML>", aStr]; 
    [attachmentWebView loadHTMLString:responseStr baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; return; 
  }
UIWebView的整个流程
1、 Loading a local PDF file into the web view
- (void)viewDidLoad { 
  [super viewDidLoad]; 
  //从本地加载 
  NSString *thePath = [[NSBundle mainBundle] pathForResource:@"iPhone_User_Guide" ofType:@"pdf"];
  if (thePath) { 
  NSData *pdfData = [NSData dataWithContentsOfFile:thePath];       
  [(UIWebView *)self.view loadData:pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil]; 
  }
  //从网络加载
  [self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]]];}
2、The web-view delegate managing network loading

- (void)webViewDidStartLoad:(UIWebView *)webView{
   // starting the load, show the activity indicator in the status bar 
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
  } 
- (void)webViewDidFinishLoad:(UIWebView *)webView{ 
   // finished loading, hide the activity indicator in the status bar 
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
  } 
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{ 
  // load error, hide the activity indicator in the status bar 
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
  // report the error inside the webview 
  NSString* errorString = [NSString stringWithFormat: @"<html><center><font size=+5 color='red'>An error occurred:<br>%@</font></center></html>", error.localizedDescription];
  [self.myWebView loadHTMLString:errorString baseURL:nil];}
3、Stopping a load request when the web view is to disappear
- (void)viewWillDisappear:(BOOL)animated{ if ( [self.myWebView loading] ) {
  [self.myWebView stopLoading]; } self.myWebView.delegate = nil; 
  // disconnect the delegate as the webview is hidden     
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
  }
 /************/引用自苹果官方文档(displaying web content)
参考博客:

http://www.jianshu.com/p/fbdb09b6b564
http://zhangbuhuai.com/2015/06/16/UIWebView-loading-local-html/
http://my.oschina.net/u/557242/blog/70836
https://m.oschina.net/blog/147507

欢迎关注我的个人微信公众号,免费送计算机各种最新视频资源!你想象不到的精彩!


0.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • IOS之UIWebView的使用 刚接触IOS开发1年多,现在对于 混合式 移动端开发越来越流行,因为开发成本上、...
    学无止境666阅读 45,761评论 5 53
  • OS之UIWebView的使用 刚接触IOS开发1年多,现在对于 混合式 移动端开发越来越流行,因为开发成本上、速...
    知之未道阅读 1,650评论 0 4
  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,619评论 2 7
  • 本文就iOS开发中如何集成3DTouch做下简单的讲解。 开发环境及调试设备:Xcode7或以上,iOS9或以上,...
    canlanrensheng阅读 945评论 0 1
  • 支链氨基酸服用的时间 比如力量训练开始的时候,马上就要做有氧运动的时候,以及健身活动结束的时候,还有很多人选择在睡...
    SYF_LEO阅读 5,853评论 0 1